Compare commits

..

1571 Commits

Author SHA1 Message Date
Owncast f1e2128d67 Bundle embedded web app 2 years ago
renovate[bot] bf92677818
fix(deps): update dependency video.js to v8.8.0 2 years ago
dependabot[bot] 2b696b640a
Bump tj-actions/changed-files from 40 to 41 in /.github/workflows (#3506) 2 years ago
Owncast 78de2a01d2 Bundle embedded web app 2 years ago
renovate[bot] 5efbe6d02a
chore(deps): update dependency @types/node to v20.10.6 2 years ago
Owncast cd0efdf577 Commit screenshots 2 years ago
Owncast f8738ce0a8 Bundle embedded web app 2 years ago
renovate[bot] e94814eb21
chore(deps): update dependency @babel/core to v7.23.7 2 years ago
Owncast d81bd0c377 Bundle embedded web app 2 years ago
renovate[bot] 93ef63ba17
fix(deps): update dependency classnames to v2.5.1 2 years ago
Owncast be95e97b00 Bundle embedded web app 2 years ago
renovate[bot] 0079dcd44c
chore(deps): update dependency sass to v1.69.6 2 years ago
Owncast f59191fd48 Commit screenshots 2 years ago
Owncast 0d1785baa7 Bundle embedded web app 2 years ago
renovate[bot] 4cb68a4219 chore(deps): update dependency less-loader to v11.1.4 2 years ago
Owncast 00cec55fe7 Bundle embedded web app 2 years ago
renovate[bot] d8382a2d36 fix(deps): update dependency classnames to v2.5.0 2 years ago
Owncast cf9ff9d516 Commit screenshots 2 years ago
dependabot[bot] 9763a1a549
Bump golang.org/x/crypto from 0.16.0 to 0.17.0 (#3502) 2 years ago
Owncast 4037bf21a6 Commit screenshots 2 years ago
Owncast 525f1f589f Bundle embedded web app 2 years ago
renovate[bot] 7b86dbd50a
chore(deps): update dependency cypress to v13.6.2 2 years ago
Owncast 1928d62f52 Bundle embedded web app 2 years ago
renovate[bot] 72b640ae7f
fix(deps): update dependency classnames to v2.4.0 2 years ago
Owncast 5fd2551ab9 Commit screenshots 2 years ago
Owncast 6e0dd8dc96 Bundle embedded web app 2 years ago
renovate[bot] bd7a4a88c6
chore(deps): update dependency sass-loader to v13.3.3 2 years ago
Owncast 5eb47dd24e Bundle embedded web app 2 years ago
renovate[bot] 9a58d2547f fix(deps): update dependency classnames to v2.3.3 2 years ago
Owncast 7b3aaf09ef Bundle embedded web app 2 years ago
renovate[bot] 90c4545474
chore(deps): update typescript-eslint monorepo to v6.16.0 2 years ago
Owncast ebcd8b7bad Commit screenshots 2 years ago
renovate[bot] cb812b98c0
chore(deps): update peter-evans/create-or-update-comment digest to 0f44b01 2 years ago
Owncast 473e11d8f7 Commit screenshots 2 years ago
Owncast 8c157e7b13 Commit screenshots 2 years ago
Owncast 1b9598e4d6 Bundle embedded web app 2 years ago
renovate[bot] ed10125c70 chore(deps): lock file maintenance 2 years ago
Owncast f8152e70c3 Commit screenshots 2 years ago
Owncast 21d9642e2a Bundle embedded web app 2 years ago
renovate[bot] dd59a11e23
chore(deps): update dependency eslint-plugin-prettier to v5.1.1 2 years ago
Owncast e1fe7f0ea5 Commit screenshots 2 years ago
Owncast f9535dd07c Bundle embedded web app 2 years ago
renovate[bot] 7291466871 chore(deps): update dependency eslint-plugin-prettier to v5.1.0 2 years ago
Owncast 051fff4a62 Commit screenshots 2 years ago
Owncast 92a267a56d Bundle embedded web app 2 years ago
renovate[bot] afa5174abd
chore(deps): update dependency html-webpack-plugin to v5.6.0 2 years ago
Owncast 0b703e748b Bundle embedded web app 2 years ago
renovate[bot] 9d6c7752a0
chore(deps): update storybook monorepo to v7.6.6 2 years ago
Owncast ccbf6664d9 Commit screenshots 2 years ago
Owncast c336752ee5 Bundle embedded web app 2 years ago
renovate[bot] 953915e500
chore(deps): update typescript-eslint monorepo to v6.15.0 2 years ago
Owncast 150bbb571d Commit screenshots 2 years ago
renovate[bot] 68a09f41e0
fix(deps): update module golang.org/x/time to v0.5.0 2 years ago
Owncast 00f1901d7a Bundle embedded web app 2 years ago
renovate[bot] 116260280c
fix(deps): update dependency sharp to v0.33.1 2 years ago
Owncast 5e0fe58fae Bundle embedded web app 2 years ago
renovate[bot] 491ad01e4c
chore(deps): update dependency @types/node to v20.10.5 2 years ago
renovate[bot] 2f5a372138
fix(deps): update module golang.org/x/net to v0.19.0 2 years ago
renovate[bot] 8f03437a05
fix(deps): update module github.com/aws/aws-sdk-go to v1.49.6 2 years ago
renovate[bot] 186d6a83b8
chore(deps): update peter-evans/create-or-update-comment digest to 76318d6 2 years ago
renovate[bot] 3098890187
chore(deps): update github/codeql-action action to v3 (#3492) 2 years ago
renovate[bot] 59fec3c47e
chore(deps): update docker.io/ubuntu docker tag to v24 (#3493) 2 years ago
renovate[bot] 6f52bec22f
fix(deps): update module github.com/shirou/gopsutil/v3 to v3.23.11 2 years ago
renovate[bot] 2c7dd3a59b
fix(deps): update module github.com/mattn/go-sqlite3 to v1.14.19 2 years ago
renovate[bot] 6486bd2039
fix(deps): update module github.com/gorilla/websocket to v1.5.1 2 years ago
Owncast 5c0d82f713 Commit screenshots 2 years ago
Gabe Kangas bb7de347c5
chore: reverting the current implementation of http response caching 2 years ago
renovate[bot] df7eb5e38d
chore(deps): update actions/setup-go action to v5 (#3489) 2 years ago
Gabe Kangas 9215d9ba0f
fix(auth): limit admin cors access to only localhost:3000 2 years ago
Owncast 2c8e11db8a Bundle embedded web app 2 years ago
renovate[bot] e666d92749
chore(deps): update dependency eslint to v8.56.0 (#3486) 2 years ago
Gabe Kangas 5bb8a8b5aa
fix: address potential crash that can happen with queued object storage uploads. Fixes #3440 2 years ago
Owncast 5d78574083 Commit screenshots 2 years ago
Owncast 9ae90dc899 Bundle embedded web app 2 years ago
renovate[bot] d7aa9cea17 chore(deps): lock file maintenance 2 years ago
dependabot[bot] ff3949278d
Bump golang.org/x/crypto from 0.15.0 to 0.17.0 (#3485) 2 years ago
Owncast 4e252015bc Bundle embedded web app 2 years ago
renovate[bot] 693b6a16ee
fix(deps): update dependency react-error-boundary to v4.0.12 2 years ago
Owncast 9e5f310ff2 Bundle embedded web app 2 years ago
renovate[bot] 4e9946ce3b
chore(deps): update storybook monorepo to v7.6.5 2 years ago
Owncast fdecfb10af Commit screenshots 2 years ago
Owncast 9d68090667 Bundle embedded web app 2 years ago
renovate[bot] 273af311fc
chore(deps): update dependency eslint-plugin-import to v2.29.1 2 years ago
Owncast 1e3a2c1abb Commit screenshots 2 years ago
Owncast c04f9ed419 Commit screenshots 2 years ago
Owncast 9b62ed6b51 Bundle embedded web app 2 years ago
renovate[bot] 9288418622 chore(deps): update typescript-eslint monorepo to v6.14.0 2 years ago
Owncast bbd5140387 Commit screenshots 2 years ago
Owncast a7adb99973 Bundle embedded web app 2 years ago
renovate[bot] f59b3e6d31
chore(deps): update dependency @babel/core to v7.23.6 2 years ago
Owncast b3aee6ae88 Commit screenshots 2 years ago
Owncast 920c8af253 Bundle embedded web app 2 years ago
renovate[bot] 03ba0d395e chore(deps): update dependency prettier to v3.1.1 2 years ago
Owncast d40ae868c6 Bundle embedded web app 2 years ago
renovate[bot] 650a1061e1 chore(deps): update dependency style-dictionary to v3.9.1 2 years ago
renovate[bot] f36c3b65f2
chore(deps): update peter-evans/create-or-update-comment digest to 83d7ae3 2 years ago
Owncast c91d2e10d9 Commit screenshots 2 years ago
Gabe Kangas e235c7aea2
chore: remove reponse cache from root route 2 years ago
Owncast a3a4cbaf0f Bundle embedded web app 2 years ago
renovate[bot] 765ed4c5a8
chore(deps): lock file maintenance (#3478) 2 years ago
Owncast 1988b82e6e Bundle embedded web app 2 years ago
renovate[bot] 70e31aff01 chore(deps): update dependency @types/node to v20.10.4 2 years ago
Owncast d4fd72ce2c Commit screenshots 2 years ago
Gabe Kangas 0827af6cc8
fix: split out the botscraper response cache from the web app 2 years ago
Gabe Kangas c8985093fb
fix(video): fix hls in-memory cache being recreated on every request 2 years ago
Owncast 42249fbc58 Bundle embedded web app 2 years ago
renovate[bot] 33eb894687
chore(deps): update storybook monorepo to v7.6.4 2 years ago
Owncast 116cfcdd4b Commit screenshots 2 years ago
Owncast 4bd35c6f7f Bundle embedded web app 2 years ago
renovate[bot] 2437e01f12
fix(deps): update dependency @fontsource/inter to v5.0.16 2 years ago
Gabe Kangas 2217f0614a
feat(api): add server-side caching for requests that could benefit (#3463) 2 years ago
Owncast b6efe49086 Bundle embedded web app 2 years ago
renovate[bot] d4ee6eaeca
chore(deps): update dependency npm to v10.2.5 2 years ago
Owncast d55aeeddcc Bundle embedded web app 2 years ago
renovate[bot] c97a85af1d
chore(deps): update dependency typescript to v5.3.3 2 years ago
Owncast 46979a564c Bundle embedded web app 2 years ago
renovate[bot] 2758e53495
chore(deps): update dependency html-webpack-plugin to v5.5.4 2 years ago
Owncast a006eb0a60 Bundle embedded web app 2 years ago
renovate[bot] 63ce053ffb
chore(deps): update dependency @types/jest to v29.5.11 2 years ago
Owncast b11fc8deb1 Commit screenshots 2 years ago
Owncast 8fd2c5b3c8 Bundle embedded web app 2 years ago
renovate[bot] 37ee16c51b
chore(deps): update dependency cypress to v13.6.1 2 years ago
renovate[bot] c439bded27
chore(deps): update alpine docker tag to v3.19.0 2 years ago
Owncast 3a8d7a610c Bundle embedded web app 2 years ago
renovate[bot] fbb04ec354
fix(deps): update dependency chart.js to v4.4.1 2 years ago
Owncast 237d212c62 Commit screenshots 2 years ago
Owncast e3c4f7b21f Bundle embedded web app 2 years ago
renovate[bot] 5360ee6012
chore(deps): update dependency @types/react to v18.2.42 2 years ago
Owncast 0a6000c84d Bundle embedded web app 2 years ago
renovate[bot] aa8b6f5c7f
chore(deps): update typescript-eslint monorepo to v6.13.2 2 years ago
Owncast ac49168d44 Commit screenshots 2 years ago
Owncast 6b48a37066 Bundle embedded web app 2 years ago
renovate[bot] 486752d75e
chore(deps): update dependency @types/node to v20.10.3 2 years ago
renovate[bot] dd51656e6d
chore(deps): update peter-evans/create-or-update-comment digest to f9285f9 2 years ago
Owncast 71385f71bb Commit screenshots 2 years ago
Owncast 53f12158c6 Bundle embedded web app 2 years ago
jhimanish 1f7ffdea27
Updating twitter logo to X using logo from Twitter's website (#3468) 2 years ago
Owncast e1452aa8b4 Bundle embedded web app 2 years ago
renovate[bot] 37811994c1
chore(deps): update dependency @types/react to v18.2.41 2 years ago
Gabe Kangas a56f0f2ed6
Create README.md for /static/web 2 years ago
Owncast 108527532b Bundle embedded web app 2 years ago
renovate[bot] b14e9c5c02
chore(deps): update dependency eslint-config-prettier to v9.1.0 2 years ago
Owncast 9959704e17 Bundle embedded web app 2 years ago
renovate[bot] eeb2b83373
chore(deps): update dependency eslint to v8.55.0 2 years ago
Owncast ab1f0a8d75 Commit screenshots 2 years ago
Owncast c2d26e3c88 Bundle embedded web app 2 years ago
renovate[bot] 0dab0b4f55
chore(deps): update dependency @types/react to v18.2.40 2 years ago
dependabot[bot] bccc67e4b6
Bump postcss and artillery in /test/load (#3467) 2 years ago
Owncast 684f7828ed Bundle embedded web app 2 years ago
renovate[bot] 5e7c5e263f
chore(deps): update dependency @types/node to v20.10.2 2 years ago
Owncast 1565c1deb2 Bundle embedded web app 2 years ago
renovate[bot] f3d9fe215c
chore(deps): update storybook monorepo to v7.6.3 2 years ago
Owncast f4bd33dde7 Bundle embedded web app 2 years ago
renovate[bot] b41e3620d1 chore(deps): lock file maintenance 2 years ago
Owncast 90a56cc61d Commit screenshots 2 years ago
Owncast 6889919db3 Bundle embedded web app 2 years ago
renovate[bot] 38104d5aaf
chore(deps): update storybook monorepo to v7.6.2 2 years ago
Owncast f6837fcce7 Commit screenshots 2 years ago
Owncast 9c12ad53e2 Bundle embedded web app 2 years ago
renovate[bot] a98d057ac2 chore(deps): update storybook monorepo to v7.6.1 2 years ago
Owncast 5ec8ab22d6 Bundle embedded web app 2 years ago
renovate[bot] 7714b79a9f
chore(deps): update dependency @types/node to v20.10.1 2 years ago
Owncast dbae8c5f37 Bundle embedded web app 2 years ago
renovate[bot] e41c2306ab
fix(deps): update dependency sharp to v0.33.0 2 years ago
Owncast 896db68278 Bundle embedded web app 2 years ago
renovate[bot] 946a3bbc35
chore(deps): update dependency @babel/core to v7.23.5 2 years ago
renovate[bot] b24d160685
fix(deps): update module mvdan.cc/xurls to v2 (#3420) 2 years ago
Owncast 40fd2bfd7a Commit screenshots 2 years ago
Owncast 3a779e9db8 Bundle embedded web app 2 years ago
renovate[bot] 3480c9fb92
chore(deps): update storybook monorepo to v7.6.0 2 years ago
Owncast ee923c77ce Bundle embedded web app 2 years ago
renovate[bot] 6b2a308ed3
chore(deps): update typescript-eslint monorepo to v6.13.1 2 years ago
Owncast 5f7f75c229 Commit screenshots 2 years ago
renovate[bot] 42778e0e3c
chore(deps): update alpine docker tag to v3.18.5 2 years ago
Owncast 26c62600df Bundle embedded web app 2 years ago
Annie Pauline 5eb043dfad
Admin horizontal scroll on narrower screens (#3406) 2 years ago
Owncast 214de6db11 Bundle embedded web app 2 years ago
renovate[bot] 54764857b1
chore(deps): update typescript-eslint monorepo to v6.13.0 2 years ago
Owncast 956ed9e921 Bundle embedded web app 2 years ago
renovate[bot] c3b3dface3
chore(deps): update dependency @types/react to v18.2.39 2 years ago
Owncast df2cb90c13 Bundle embedded web app 2 years ago
renovate[bot] 5e3ed74025
fix(deps): update dependency @codemirror/lang-markdown to v6.2.3 2 years ago
Owncast 70255a0b8c Bundle embedded web app 2 years ago
Gabe Kangas 27c48c4068
chore(deps): update to next config to address build errors 2 years ago
Gabe Kangas 6d217b4f5a
fix(web): do not set nextjs rewrites on prod builds 2 years ago
Gabe Kangas b145f3da9a
chore(deps): additional things to ignore in unused code check 2 years ago
Owncast 804ef4caf5 Commit screenshots 2 years ago
Owncast 32f30ecfc7 Bundle embedded web app 2 years ago
renovate[bot] c7f8bd8f54
fix(deps): update dependency @uiw/react-codemirror to v4.21.21 2 years ago
Owncast 4c1e42a33c Bundle embedded web app 2 years ago
renovate[bot] 8ecbe79284
fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.21.21 2 years ago
renovate[bot] f707f07aae
chore(deps): update peter-evans/create-or-update-comment digest to 89116ac 2 years ago
Owncast 11eaaf4310 Commit screenshots 2 years ago
Owncast 8294cd5a44 Commit screenshots 2 years ago
Owncast 509774e5ae Bundle embedded web app 2 years ago
renovate[bot] 689905471f chore(deps): lock file maintenance 2 years ago
Owncast 418da09dae Bundle embedded web app 2 years ago
renovate[bot] a6f408b6f9
chore(deps): update dependency @types/node to v20.10.0 2 years ago
Owncast 472d3f8e35 Commit screenshots 2 years ago
Owncast 10120123e8 Bundle embedded web app 2 years ago
renovate[bot] 200ca747ad
chore(deps): update dependency @types/node to v20.9.5 2 years ago
Owncast 06326a7e64 Bundle embedded web app 2 years ago
renovate[bot] ea6bf24029
chore(deps): update dependency knip to v2.43.0 2 years ago
Owncast 5a949bd89e Bundle embedded web app 2 years ago
renovate[bot] 6cba556926
chore(deps): update dependency knip to v2.42.0 2 years ago
Owncast a49b758746 Commit screenshots 2 years ago
Owncast 3442857422 Bundle embedded web app 2 years ago
renovate[bot] 8d439909b5 chore(deps): update dependency knip to v2.41.6 2 years ago
Owncast c146555979 Bundle embedded web app 2 years ago
renovate[bot] 5e1f03b5cf
chore(deps): update dependency cypress to v13.6.0 2 years ago
Owncast 8a160342b6 Bundle embedded web app 2 years ago
renovate[bot] be0a62f898
fix(deps): update dependency antd to v4.24.15 2 years ago
Owncast 66c5f38e41 Bundle embedded web app 2 years ago
renovate[bot] 256d6c7928
chore(deps): update dependency @types/node to v20.9.4 2 years ago
Owncast 78055ef9df Bundle embedded web app 2 years ago
renovate[bot] 04b985d33c
chore(deps): update dependency @types/jest to v29.5.10 2 years ago
Owncast 14e9ca2a56 Commit screenshots 2 years ago
Owncast a1b3f47863 Bundle embedded web app 2 years ago
renovate[bot] e9e10d059e
chore(deps): update dependency typescript to v5.3.2 (#3435) 2 years ago
Owncast cba878f70d Bundle embedded web app 2 years ago
renovate[bot] 6115baad9d
chore(deps): update dependency @types/sanitize-html to v2.9.5 2 years ago
Owncast 2164ad39db Bundle embedded web app 2 years ago
renovate[bot] 5633581711
chore(deps): update dependency @types/react to v18.2.38 2 years ago
Owncast df8019af5f Bundle embedded web app 2 years ago
renovate[bot] b3690ef970
chore(deps): update dependency @types/markdown-it to v13.0.7 (#3436) 2 years ago
Owncast e758cf82e0 Bundle embedded web app 2 years ago
renovate[bot] 2b86f5b733
chore(deps): update dependency @types/prop-types to v15.7.11 2 years ago
Owncast a3ac75f116 Bundle embedded web app 2 years ago
renovate[bot] a7207e3d2c
chore(deps): update dependency @types/node to v20.9.3 2 years ago
Owncast 5c4bbd7ef5 Bundle embedded web app 2 years ago
renovate[bot] 53ba75d7e9
chore(deps): update dependency @types/jest to v29.5.9 2 years ago
Owncast 707472792b Bundle embedded web app 2 years ago
renovate[bot] 89091fcefa
fix(deps): update nextjs monorepo to v14 (major) (#3404) 2 years ago
Owncast a809a56e0c Commit screenshots 2 years ago
Owncast 0815ab3e9f Bundle embedded web app 2 years ago
renovate[bot] 11d48cbaa1
chore(deps): update dependency @types/chart.js to v2.9.41 2 years ago
Owncast b3ce115bec Bundle embedded web app 2 years ago
renovate[bot] 5061598795
chore(deps): update typescript-eslint monorepo to v6.12.0 2 years ago
Owncast 9a9b081a25 Bundle embedded web app 2 years ago
renovate[bot] c1fbf09333
chore(deps): update dependency knip to v2.41.5 2 years ago
Owncast 922ecf55a7 Commit screenshots 2 years ago
renovate[bot] bd91ee5a97
chore(deps): update peter-evans/create-or-update-comment digest to 0917427 2 years ago
Owncast 3e4fdfa25a Commit screenshots 2 years ago
Owncast 8686eed98b Bundle embedded web app 2 years ago
renovate[bot] 30062b4e55
chore(deps): update dependency @types/node to v20.9.2 2 years ago
Owncast c5dc1212c3 Commit screenshots 2 years ago
Gabe Kangas b4c73315fa
feat(log): point to passthrough as a potential issue when unable to generate thumbnails 2 years ago
Gabe Kangas dfe5dd494e
chore: bump version number 2 years ago
Owncast b3bb5b9b4a Bundle embedded web app 2 years ago
renovate[bot] f987cb996c
chore(deps): update dependency eslint to v8.54.0 2 years ago
Owncast 1575a147f5 Bundle embedded web app 2 years ago
renovate[bot] d79fcf1f36
chore(deps): update dependency chromatic to v9.1.0 2 years ago
Owncast c960ceb3c6 Bundle embedded web app 2 years ago
renovate[bot] 273795590e chore(deps): lock file maintenance 2 years ago
Owncast 50bf241531 Commit screenshots 2 years ago
Owncast db3ec9c123 Bundle embedded web app 2 years ago
renovate[bot] 0d05a2784a
chore(deps): update dependency knip to v2.41.3 2 years ago
Owncast c8616c5a68 Bundle embedded web app 2 years ago
renovate[bot] d163a6078b
chore(deps): update dependency @types/node to v20.9.1 2 years ago
Owncast cfd41090a9 Commit screenshots 2 years ago
Owncast b9be7591ce Bundle embedded web app 2 years ago
renovate[bot] e97d524293
chore(deps): update dependency npm to v10.2.4 2 years ago
Owncast b2c0ab4662 Commit screenshots 2 years ago
Owncast 161fbc9679 Bundle embedded web app 2 years ago
renovate[bot] 56154aadd1
chore(deps): update dependency cypress to v13.5.1 2 years ago
Owncast b0ecf23d49 Commit screenshots 2 years ago
Owncast 11899276ea Bundle embedded web app 2 years ago
renovate[bot] e9caf68cc4
chore(deps): update typescript-eslint monorepo to v6.11.0 (#3430) 2 years ago
Owncast e1113686ba Bundle embedded web app 2 years ago
renovate[bot] 783c58b27a
fix(deps): update dependency react-markdown to v9.0.1 2 years ago
Owncast 6bb92c01a4 Bundle embedded web app 2 years ago
renovate[bot] 0125a592bd
chore(deps): update dependency knip to v2.41.2 2 years ago
Owncast 44022ec2d7 Bundle embedded web app 2 years ago
renovate[bot] cdcfea5e7c
chore(deps): update dependency prettier to v3.1.0 2 years ago
Owncast 151092eac1 Commit screenshots 2 years ago
renovate[bot] 80fd65f8f7
chore(deps): update peter-evans/create-or-update-comment digest to b2c2ea4 2 years ago
Owncast 5fde958a5e Commit screenshots 2 years ago
Owncast cae179ab4f Commit screenshots 2 years ago
Owncast 7cd061bf7f Bundle embedded web app 2 years ago
renovate[bot] 3d6c92a92c
chore(deps): update dependency chromatic to v9 (#3425) 2 years ago
Owncast f6fcc40e17 Bundle embedded web app 2 years ago
renovate[bot] 6fbed1ac75 chore(deps): lock file maintenance 2 years ago
Owncast 6c9222b49e Commit screenshots 2 years ago
Owncast 3ba04789be Bundle embedded web app 2 years ago
renovate[bot] a2425d236c
chore(deps): update dependency knip to v2.40.2 2 years ago
renovate[bot] 316b9fff96
fix(deps): update module golang.org/x/time to v0.4.0 2 years ago
Owncast bd65b10367 Bundle embedded web app 2 years ago
Gabe Kangas 34a474b30d
feat(chat): have unique icons for join and part messages. Closes #3421 2 years ago
renovate[bot] c17a762067
fix(deps): update module golang.org/x/net to v0.18.0 2 years ago
Owncast 02367fe5e6 Bundle embedded web app 2 years ago
renovate[bot] e4ab5ce91c
chore(deps): update dependency knip to v2.40.1 2 years ago
Owncast ce796ee4e8 Bundle embedded web app 2 years ago
renovate[bot] d8ebe3ab60
chore(deps): update dependency @babel/core to v7.23.3 2 years ago
Owncast 8c85ab08f2 Commit screenshots 2 years ago
renovate[bot] 0908eb8cd8
fix(deps): update module golang.org/x/mod to v0.14.0 2 years ago
Owncast 03ff549184 Bundle embedded web app 2 years ago
renovate[bot] 850d7047b3
chore(deps): update dependency cypress to v13.5.0 2 years ago
renovate[bot] 08a95661bf
fix(deps): update module github.com/aws/aws-sdk-go to v1.47.9 2 years ago
Owncast 36846d22ff Bundle embedded web app 2 years ago
renovate[bot] 1d3425d239
chore(deps): update dependency @types/node to v20.9.0 2 years ago
Owncast d1f748c7fb Bundle embedded web app 2 years ago
renovate[bot] 011585aec8
chore(deps): update dependency @types/video.js to v7.3.56 2 years ago
Owncast 6b3506f12c Bundle embedded web app 2 years ago
renovate[bot] fa41548acc
chore(deps): update dependency @types/ua-parser-js to v0.7.39 2 years ago
Owncast c34fa70d4b Bundle embedded web app 2 years ago
renovate[bot] a72ab8dac5
chore(deps): update dependency @types/sanitize-html to v2.9.4 2 years ago
Owncast 85fffb61df Bundle embedded web app 2 years ago
renovate[bot] e54447e6b7
chore(deps): update dependency @types/react to v18.2.37 2 years ago
Owncast ab78d20d89 Commit screenshots 2 years ago
Owncast 4dd54237f0 Bundle embedded web app 2 years ago
renovate[bot] 272a20d379
chore(deps): update dependency @types/jest to v29.5.8 2 years ago
Owncast 833c15db49 Bundle embedded web app 2 years ago
renovate[bot] 21a0c6b250
chore(deps): update dependency @types/react-linkify to v1.0.4 2 years ago
Owncast d17ee70760 Bundle embedded web app 2 years ago
renovate[bot] 0931c43fdc
chore(deps): update dependency @types/prop-types to v15.7.10 2 years ago
Owncast 31720f97fb Bundle embedded web app 2 years ago
renovate[bot] 02fac5120e
chore(deps): update dependency @types/markdown-it to v13.0.6 2 years ago
Owncast 77a55e2d16 Bundle embedded web app 2 years ago
renovate[bot] da70d2d641
chore(deps): update typescript-eslint monorepo to v6.10.0 2 years ago
renovate[bot] 153c536dc3
fix(deps): update module github.com/shirou/gopsutil/v3 to v3.23.10 2 years ago
Owncast 3a807b7bf5 Bundle embedded web app 2 years ago
renovate[bot] e0b74819c8
chore(deps): update dependency knip to v2.40.0 2 years ago
Owncast 1bdbffe411 Bundle embedded web app 2 years ago
renovate[bot] 33ad53891f
fix(deps): update module mvdan.cc/xurls to v2 (#3369) 2 years ago
renovate[bot] c5e2d9d73c
chore(deps): update dependency @types/chart.js to v2.9.40 2 years ago
Owncast fe246ffd43 Bundle embedded web app 2 years ago
Gabe Kangas 72dd209d80
fix: ignore this file that is being problematic 2 years ago
Owncast 208fc40d67 Commit screenshots 2 years ago
Gabe Kangas 76c3057c88
Update links to docker image in readme 2 years ago
Owncast 2622cde8ed Bundle embedded web app 2 years ago
renovate[bot] c0c21ab019
chore(deps): update storybook monorepo to v7.5.3 2 years ago
Owncast ae4ccbbc19 Bundle embedded web app 2 years ago
renovate[bot] 67639bd07a
chore(deps): update dependency mermaid to v10.6.1 2 years ago
Owncast 57d2bd0e1e Bundle embedded web app 2 years ago
renovate[bot] 36f51d8d00
chore(deps): update dependency @types/react to v18.2.36 2 years ago
Owncast 3139d765c4 Bundle embedded web app 2 years ago
renovate[bot] 0c529fe1be
chore(deps): update dependency eslint-plugin-jsx-a11y to v6.8.0 (#3414) 2 years ago
Owncast 87e1e1e6f2 Bundle embedded web app 2 years ago
Owncast af26f0dac9 Commit screenshots 2 years ago
Gabe Kangas 9db8a8699a
fix: a11y button lables. Closes #3418 2 years ago
Gabe Kangas 6074ea8f29
fix: parse as ipv4 if needed. Closes #3419 2 years ago
Owncast 86472d711c Bundle embedded web app 2 years ago
renovate[bot] a299200b3b
chore(deps): update dependency @types/react to v18.2.35 2 years ago
renovate[bot] ae91f30b31
chore(deps): update peter-evans/create-or-update-comment digest to a6e9cd3 2 years ago
Owncast d34afe45e2 Commit screenshots 2 years ago
Owncast 3ac2c865cc Bundle embedded web app 2 years ago
renovate[bot] 0476255e0a
chore(deps): update dependency eslint to v8.53.0 2 years ago
Owncast dea8c1201c Commit screenshots 2 years ago
Owncast 8a8cfd3fb1 Bundle embedded web app 2 years ago
kame 4f078e1ee4
Migrated Storybook notation from CSF2 to CSF3 (#3412) 2 years ago
Owncast b08511b9d1 Bundle embedded web app 2 years ago
renovate[bot] 9d64b656aa chore(deps): lock file maintenance 2 years ago
Owncast e276f2a5f5 Bundle embedded web app 2 years ago
Owncast f1dcc9884f Commit screenshots 2 years ago
renovate[bot] 9fc8dfefc9
fix(deps): update dependency yaml to v2.3.4 2 years ago
Owncast 9b20129342 Bundle embedded web app 2 years ago
renovate[bot] 7e69597199
chore(deps): update dependency stylelint-config-standard-scss to v11.1.0 2 years ago
Owncast bf6907fa45 Bundle embedded web app 2 years ago
renovate[bot] 0b1b825611
chore(deps): update dependency npm to v10.2.3 2 years ago
Owncast bff4d6da21 Commit screenshots 2 years ago
Owncast 301038fbf0 Bundle embedded web app 2 years ago
renovate[bot] 69b33db5d4
chore(deps): update dependency @types/react to v18.2.34 2 years ago
Owncast f19f62129b Bundle embedded web app 2 years ago
renovate[bot] b5c864fdef
chore(deps): update dependency knip to v2.38.6 2 years ago
Owncast cfba31f910 Commit screenshots 2 years ago
Owncast a3282a6e41 Bundle embedded web app 2 years ago
renovate[bot] 928a17ae8a
chore(deps): update dependency chromatic to v7.6.0 2 years ago
Owncast af27afbe73 Bundle embedded web app 2 years ago
renovate[bot] 586c9c5202
chore(deps): update dependency npm to v10.2.2 2 years ago
Owncast e49a54c9c7 Bundle embedded web app 2 years ago
renovate[bot] a1fc51db26
chore(deps): update dependency @types/node to v20.8.10 2 years ago
Owncast 75094048a4 Commit screenshots 2 years ago
Owncast c3a9f987ea Bundle embedded web app 2 years ago
renovate[bot] 4bc9aa9787
chore(deps): update dependency cypress to v13.4.0 2 years ago
Owncast 582d26e5a8 Bundle embedded web app 2 years ago
renovate[bot] fd340979ee
chore(deps): update dependency @types/jest to v29.5.7 2 years ago
Owncast 90f6b068ad Bundle embedded web app 2 years ago
renovate[bot] 008a6a9877
chore(deps): update typescript-eslint monorepo to v6.9.1 2 years ago
Owncast 03cf854b35 Bundle embedded web app 2 years ago
renovate[bot] b427601e1d
chore(deps): update storybook monorepo to v7.5.2 2 years ago
Owncast 6607b23a27 Commit screenshots 2 years ago
renovate[bot] 0614ac82ee
chore(deps): update peter-evans/create-or-update-comment digest to cf82516 2 years ago
Owncast c336c25c54 Commit screenshots 2 years ago
Owncast e49b7bf805 Commit updated API documentation 2 years ago
Meisam cd416fa19b
fix /api/admin/config/streamkeys docs (#3409) 2 years ago
Owncast c4357b2b9f Commit screenshots 2 years ago
Owncast 4e087a5825 Bundle embedded web app 2 years ago
renovate[bot] af204d3eb3
fix(deps): update dependency ua-parser-js to v1.0.37 2 years ago
Owncast 3b469440f2 Bundle embedded web app 2 years ago
renovate[bot] 755586260a chore(deps): lock file maintenance 2 years ago
Owncast 9139d2bcee Commit screenshots 2 years ago
renovate[bot] 2b6c68b85f
fix(deps): update module github.com/yuin/goldmark to v1.6.0 (#3403) 2 years ago
Owncast 771295b371 Bundle embedded web app 2 years ago
renovate[bot] 1030256ced
chore(deps): update dependency chromatic to v7.5.4 2 years ago
renovate[bot] cb135d6ca3
fix(deps): update module github.com/aws/aws-sdk-go to v1.46.6 2 years ago
Owncast 8e654c3705 Bundle embedded web app 2 years ago
renovate[bot] 29b1261952
chore(deps): update dependency mermaid to v10.6.0 2 years ago
Owncast 6900ae7752 Bundle embedded web app 2 years ago
renovate[bot] c7e0d7bd6e
chore(deps): update dependency chromatic to v7.5.1 2 years ago
Owncast e4159b1204 Bundle embedded web app 2 years ago
renovate[bot] a8590138e3
chore(deps): update dependency @types/react to v18.2.33 2 years ago
Owncast a3641ace9c Commit screenshots 2 years ago
Owncast 4525cda89a Bundle embedded web app 2 years ago
renovate[bot] 7684e22cc2
chore(deps): update dependency sass to v1.69.5 2 years ago
renovate[bot] 40c94a5a49
chore(deps): update tj-actions/changed-files action to v40 (#3402) 2 years ago
Owncast 856f100fd1 Bundle embedded web app 2 years ago
renovate[bot] 9fb1363988
chore(deps): update dependency @mdx-js/react to v3 (#3400) 2 years ago
renovate[bot] 2362f1a82a
chore(deps): update actions/setup-node action to v4 (#3399) 2 years ago
renovate[bot] 3961e68368
chore(deps): update dependency @types/node to v20 (#3401) 2 years ago
Owncast 4d05a1b0a2 Bundle embedded web app 2 years ago
renovate[bot] f5748ea1cf
chore(deps): update dependency @types/node to v18.18.7 2 years ago
Owncast 248320a506 Bundle embedded web app 2 years ago
renovate[bot] 3a63547a3d
chore(deps): update dependency @types/react to v18.2.32 2 years ago
Gabe Kangas a6dbc37a84
fix: add additional validation before making remote requests (#3398) 2 years ago
Owncast 5406e3d5da Commit screenshots 2 years ago
Matthew Donoughe 448659e1c6
Ignore static/web for codeql (#3397) 2 years ago
Owncast 3cf550c916 Bundle embedded web app 2 years ago
renovate[bot] 6ffe1cfc67
chore(deps): update dependency cypress to v13.3.3 2 years ago
Owncast 01926a20fb Bundle embedded web app 2 years ago
renovate[bot] 574376f3d5
chore(deps): update dependency knip to v2.38.1 2 years ago
Owncast 861a8bd594 Bundle embedded web app 2 years ago
renovate[bot] b2ae296666
chore(deps): update dependency chromatic to v7.5.0 2 years ago
Owncast c56764b946 Bundle embedded web app 2 years ago
renovate[bot] f3afedfe48
chore(deps): update typescript-eslint monorepo to v6.9.0 2 years ago
Owncast 6dddb668e3 Commit screenshots 2 years ago
Owncast 31cb85f219 Bundle embedded web app 2 years ago
dependabot[bot] 0c0e218b8e
Bump browserify-sign from 4.2.1 to 4.2.2 in /web (#3396) 2 years ago
Owncast c37ef513e4 Bundle embedded web app 2 years ago
renovate[bot] 21776fd9a2
chore(deps): update dependency style-dictionary to v3.9.0 2 years ago
Owncast 319e7fcffa Bundle embedded web app 2 years ago
renovate[bot] 143db1b039
fix(deps): update dependency xstate to v4.38.3 2 years ago
Owncast 75af7cfc53 Bundle embedded web app 2 years ago
renovate[bot] 38ed16d971
chore(deps): update dependency @types/markdown-it to v13.0.5 2 years ago
Owncast 57d943cb8c Bundle embedded web app 2 years ago
renovate[bot] b28b027ead
chore(deps): update dependency typescript to v5 (#3387) 2 years ago
Owncast 15b116568c Bundle embedded web app 2 years ago
Gabe Kangas ab8c2279e3
fix(storybook): update stories to support mdx2 2 years ago
Gabe Kangas c22d5357ab
fix(storybook): less+sass updates for storybook7 2 years ago
Gabe Kangas 349a23c690
chore(deps): update storybook to v7 2 years ago
Owncast f2524c8849 Commit screenshots 2 years ago
Owncast c7e291bb34 Bundle embedded web app 2 years ago
Gabe Kangas 57ff30c894
fix(admin): hopefully fix an exception that is being thrown in develop. Closes #3373 2 years ago
Owncast 9ab6fd9283 Commit updated API documentation 2 years ago
Meisam ddf359937e
fix api/admin/config/pagecontent example (#3392) 2 years ago
Owncast 5aaa520f1f Bundle embedded web app 2 years ago
renovate[bot] b5a9076259
fix(deps): update dependency video.js to v8.6.1 2 years ago
renovate[bot] e2574bb35e
chore(deps): update peter-evans/create-or-update-comment digest to c0693c5 2 years ago
Owncast cff180b305 Bundle embedded web app 2 years ago
Pranav Joglekar b8ffe5be16
fix: prevent floating mobile action menu button (#3383) 2 years ago
Owncast e455d9332c Commit screenshots 2 years ago
Gabe Kangas ad3588a23c
More changed-files troubleshooting 2 years ago
Gabe Kangas 839f926f69
Looks like we were using the changed-files action incorrectly. Hopefully this fixes it? 2 years ago
Owncast a319d99994 Commit screenshots 2 years ago
Owncast b8b3c98e1b Bundle embedded web app 2 years ago
renovate[bot] dabc237101
chore(deps): update dependency eslint to v8.52.0 2 years ago
Owncast 6c820015e8 Bundle embedded web app 2 years ago
renovate[bot] 72099d1169
chore(deps): update dependency @types/react to v18.2.31 2 years ago
Owncast 969fb71272 Bundle embedded web app 2 years ago
renovate[bot] dd47c95972
chore(deps): lock file maintenance (#3384) 2 years ago
Owncast 2f501cbd13 Bundle embedded web app 2 years ago
renovate[bot] 74b379a6d5
fix(deps): update dependency @fontsource/inter to v5.0.14 (#3386) 2 years ago
Owncast 1d9b602ce8 Bundle embedded web app 2 years ago
renovate[bot] 8aeb19b7d5
fix(deps): update nextjs monorepo to v13.5.6 2 years ago
Owncast cc4ab1a50b Bundle embedded web app 2 years ago
renovate[bot] 0775a1ce1b
chore(deps): update dependency npm to v10.2.1 2 years ago
Owncast ce598a27f7 Bundle embedded web app 2 years ago
renovate[bot] 73191d9c0f
chore(deps): update dependency cypress to v13.3.2 2 years ago
Owncast b47e74444a Commit screenshots 2 years ago
Owncast 2eee20a909 Bundle embedded web app 2 years ago
renovate[bot] a9c008f16e
chore(deps): update dependency @types/video.js to v7.3.55 2 years ago
Owncast f1a4c79521 Bundle embedded web app 2 years ago
renovate[bot] b68a7ceabf
chore(deps): update dependency @types/react to v18.2.30 2 years ago
Owncast 1255cf2983 Bundle embedded web app 2 years ago
renovate[bot] bfcdbe432f
chore(deps): update dependency @types/ua-parser-js to v0.7.38 2 years ago
Owncast 54201afbc5 Bundle embedded web app 2 years ago
renovate[bot] 89be09c80f
chore(deps): update dependency @types/sanitize-html to v2.9.3 2 years ago
Owncast d67453e60f Bundle embedded web app 2 years ago
renovate[bot] aee9ad9c99
chore(deps): update dependency @types/react-linkify to v1.0.3 2 years ago
Owncast c53b1a319b Bundle embedded web app 2 years ago
renovate[bot] df0bfe86f5
chore(deps): update dependency @types/react to v18.2.29 2 years ago
Owncast 310f41bcc0 Bundle embedded web app 2 years ago
renovate[bot] ea0691eddd
chore(deps): update dependency @types/prop-types to v15.7.9 2 years ago
Gabe Kangas 027f2544e3
fix(emoji): hopefully guard against the crash in #3331 2 years ago
Owncast b1c0e14161 Bundle embedded web app 2 years ago
Patrick Bollinger 9a7925444f
Fix embedded status bar being cut off (#3352) 2 years ago
Owncast 0b16a2f831 Commit screenshots 2 years ago
Owncast 615d9efe0b Bundle embedded web app 2 years ago
renovate[bot] 2550d27d57
chore(deps): update dependency @types/markdown-it to v13.0.4 2 years ago
Owncast 6a675e395c Bundle embedded web app 2 years ago
renovate[bot] fcad5e3e3c
chore(deps): update dependency @types/node to v18.18.6 2 years ago
Owncast 6380d84def Bundle embedded web app 2 years ago
renovate[bot] 0022818d02
chore(deps): update dependency @types/jest to v29.5.6 (#3380) 2 years ago
renovate[bot] 790f384236
chore(deps): update dependency @types/markdown-it to v13.0.3 (#3381) 2 years ago
Owncast 3db3afb492 Bundle embedded web app 2 years ago
Alyssa Ross 092134f3f3
Fix parsing of Authorization Bearer header (#3376) 2 years ago
renovate[bot] 6fc3fa37da
chore(deps): update dependency knip to v2.34.1 (#3379) 2 years ago
Gabe Kangas 56eb2a4785
chore(lint): silence linter warnings 2 years ago
Owncast 5889f53f62 Bundle embedded web app 2 years ago
renovate[bot] d137b89302 chore(deps): update dependency @types/chart.js to v2.9.39 2 years ago
Owncast 53c0c080c0 Commit screenshots 2 years ago
Owncast 1fddae6f1f Bundle embedded web app 2 years ago
renovate[bot] 0ea5cf400c
chore(deps): update dependency sass to v1.69.4 2 years ago
Owncast 50deedf47d Bundle embedded web app 2 years ago
renovate[bot] 2dd17c8ffe
chore(deps): update typescript-eslint monorepo to v6.8.0 2 years ago
Owncast 03d815e959 Commit screenshots 2 years ago
Owncast c5567fa33c Bundle embedded web app 2 years ago
renovate[bot] 91526c904c
fix(deps): update nextjs monorepo to v13.5.5 2 years ago
Owncast 8344e6f895 Bundle embedded web app 2 years ago
renovate[bot] 3dc25879ff
fix(deps): update dependency react-virtuoso to v4.6.2 2 years ago
renovate[bot] 7de63fcca5
chore(deps): update peter-evans/create-or-update-comment digest to 23ff157 2 years ago
Owncast e03ae74586 Commit screenshots 2 years ago
armadi1809 6b27d850d8
Added a check for the port before calling the splitHostPort function (#3372) 2 years ago
renovate[bot] 47d5b3c92f
chore(deps): update peter-evans/create-or-update-comment digest to d85800f 2 years ago
renovate[bot] 39827872ac
fix(deps): update module golang.org/x/mod to v0.13.0 2 years ago
Owncast ea0a69fdfb Commit screenshots 2 years ago
renovate[bot] f7aabe2173
fix(deps): update module github.com/microcosm-cc/bluemonday to v1.0.26 (#3356) 2 years ago
Gabe Kangas 6aa758501d
chore(go): bump project version number to 1.21 2 years ago
renovate[bot] ef6902695e
fix(deps): update module github.com/aws/aws-sdk-go to v1.45.27 2 years ago
Owncast 7a82697ee0 Bundle embedded web app 2 years ago
renovate[bot] a6ecd7944e
fix(deps): update dependency yaml to v2.3.3 2 years ago
Owncast 72e5780b0b Commit screenshots 2 years ago
Owncast 76702d8010 Bundle embedded web app 2 years ago
renovate[bot] cedc87c88f
chore(deps): update dependency chromatic to v7.4.0 2 years ago
dependabot[bot] 5f974806f3
Bump @babel/traverse from 7.12.5 to 7.23.2 in /test/automated/api (#3366) 2 years ago
A. Singh 427f4ecdd7
fix: issue with lint and prettier during js format build (#3362) 2 years ago
dependabot[bot] 551b9e3a8b
Bump @babel/traverse from 7.12.5 to 7.23.2 in /test/automated/hls (#3367) 2 years ago
Owncast 0276bf616d Bundle embedded web app 2 years ago
renovate[bot] a7edffdee1
fix(deps): update dependency react-markdown to v9 (#3365) 2 years ago
Owncast 5838180b77 Bundle embedded web app 2 years ago
renovate[bot] 3b402e51ec chore(deps): lock file maintenance 2 years ago
Owncast a1bded155c Bundle embedded web app 2 years ago
renovate[bot] c8f5a1da93
fix(deps): update dependency @uiw/react-codemirror to v4.21.20 2 years ago
renovate[bot] 415d0299b0
fix(deps): update module mvdan.cc/xurls to v2 (#3363) 2 years ago
Owncast 65248cd658 Bundle embedded web app 2 years ago
renovate[bot] c473314f74
fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.21.20 2 years ago
Owncast 80355cb339 Commit screenshots 2 years ago
Owncast 35b01f589e Bundle embedded web app 2 years ago
Gabe Kangas 650d66a0a1
chore: downgrade x/mod to silence go 1.21 toolchain error 2 years ago
renovate[bot] f5698ab6e6
chore(deps): update dependency knip to v2.33.3 (#3353) 2 years ago
Owncast c3866152b2 Bundle embedded web app 2 years ago
armadi1809 81c5908545
Set aria-live to off on span responsible for rendering the online message on a stream (#3361) 2 years ago
Owncast 0c06c39960 Bundle embedded web app 2 years ago
renovate[bot] 043ffadd6f
chore(deps): update dependency @types/node to v18.18.5 2 years ago
armadi1809 3019995a6f
Fix geo details for viewers not showing on CDN connection (#3359) 2 years ago
Owncast 77f23fdbf7 Bundle embedded web app 2 years ago
renovate[bot] 0d3c5fb1c4
chore(deps): update dependency sass to v1.69.3 2 years ago
Owncast 5fd37d8efa Commit screenshots 2 years ago
Owncast 9585d2e77f Bundle embedded web app 2 years ago
renovate[bot] d2dda1d81f
chore(deps): update dependency @babel/core to v7.23.2 2 years ago
Owncast 40cfb1c9e1 Bundle embedded web app 2 years ago
renovate[bot] c0d854e018
chore(deps): update dependency cypress to v13.3.1 2 years ago
Owncast e66449799c Bundle embedded web app 2 years ago
renovate[bot] 39ac4c1816
chore(deps): update dependency chromatic to v7.3.0 (#3357) 2 years ago
Owncast 6bdfb39304 Bundle embedded web app 2 years ago
renovate[bot] d86211f8bc
chore(deps): update dependency sass to v1.69.2 2 years ago
Owncast e436955623 Bundle embedded web app 2 years ago
renovate[bot] 332fcbf488
chore(deps): update dependency eslint-plugin-prettier to v5.0.1 2 years ago
Owncast f26560e9d9 Bundle embedded web app 2 years ago
renovate[bot] 3259479a9b
chore(deps): update dependency @types/sanitize-html to v2.9.2 2 years ago
Owncast 655b13073e Commit screenshots 2 years ago
Owncast 61ac4ab6af Bundle embedded web app 2 years ago
renovate[bot] bec3384ec3
chore(deps): update dependency @types/react to v18.2.28 2 years ago
Owncast e64545c206 Bundle embedded web app 2 years ago
renovate[bot] 8009ab21c6
fix(deps): update dependency react-virtuoso to v4.6.1 2 years ago
Owncast 70bde1a93b Bundle embedded web app 2 years ago
renovate[bot] 390143cb6a
fix(deps): update dependency video.js to v8.6.0 2 years ago
Owncast f91f5af6f0 Bundle embedded web app 2 years ago
renovate[bot] 8d6407fa97
chore(deps): update dependency sass to v1.69.1 2 years ago
Owncast 5dc9748bf5 Commit screenshots 2 years ago
Owncast 3d7d121ea5 Bundle embedded web app 2 years ago
renovate[bot] db50a464de
chore(deps): update typescript-eslint monorepo to v6.7.5 2 years ago
Owncast fb22968013 Bundle embedded web app 2 years ago
renovate[bot] d42deb9392
chore(deps): update dependency @types/react to v18.2.27 2 years ago
Owncast 72e3e74b60 Commit screenshots 2 years ago
renovate[bot] 00b90bcd56
fix(deps): update module golang.org/x/net to v0.17.0 [security] 2 years ago
Owncast fabfe0c115 Bundle embedded web app 2 years ago
renovate[bot] 7db03075fb
chore(deps): update dependency eslint-plugin-storybook to v0.6.15 2 years ago
renovate[bot] 0264943fa9
chore(deps): update peter-evans/create-or-update-comment digest to ac8e650 2 years ago
Owncast 13afdee1a6 Bundle embedded web app 2 years ago
Owncast 4f5d05b744 Commit screenshots 2 years ago
renovate[bot] 7f561b842b
fix(deps): update dependency @fontsource/inter to v5.0.13 (#3354) 2 years ago
Owncast 1b96059410 Bundle embedded web app 2 years ago
renovate[bot] 4d085df370
fix(deps): update nextjs monorepo to v13.5.4 2 years ago
renovate[bot] d1159fbdfe
fix(deps): update module gopkg.in/evanphx/json-patch.v5 to v5.7.0 2 years ago
renovate[bot] d96e3d425a
fix(deps): update module golang.org/x/mod to v0.13.0 2 years ago
renovate[bot] 4fc15115d5
fix(deps): update module github.com/sherclockholmes/webpush-go to v1.3.0 2 years ago
renovate[bot] 44606c697f
fix(deps): update module github.com/prometheus/client_golang to v1.17.0 2 years ago
renovate[bot] 294b29d4e2
fix(deps): update module github.com/shirou/gopsutil/v3 to v3.23.9 2 years ago
Owncast 4e4d79b465 Bundle embedded web app 2 years ago
renovate[bot] f1ec6242fa
chore(deps): update dependency @types/node to v18.18.4 2 years ago
Owncast facd853e6e Commit screenshots 2 years ago
renovate[bot] 14ac527772
fix(deps): update module github.com/aws/aws-sdk-go to v1.45.24 2 years ago
Owncast 6b952522b1 Bundle embedded web app 2 years ago
renovate[bot] 486eb55cd0
chore(deps): update dependency knip to v2.31.0 2 years ago
Owncast e949474d08 Bundle embedded web app 2 years ago
renovate[bot] 130659e1d3
chore(deps): update dependency eslint to v8.51.0 2 years ago
Owncast 9c91a87ce0 Bundle embedded web app 2 years ago
renovate[bot] 82e150a127
chore(deps): update dependency sass to v1.69.0 2 years ago
Owncast e108079de1 Bundle embedded web app 2 years ago
renovate[bot] 47ef1886a8
fix(deps): update dependency @codemirror/lang-markdown to v6.2.2 2 years ago
Owncast ee65841245 Bundle embedded web app 2 years ago
renovate[bot] da16dba81a
chore(deps): update dependency chromatic to v7.2.3 2 years ago
Owncast a232dc8bcb Bundle embedded web app 2 years ago
renovate[bot] be557ac216
chore(deps): update dependency mermaid to v10.5.0 2 years ago
Owncast 5a7696c2bc Bundle embedded web app 2 years ago
renovate[bot] 8fa77288c8
chore(deps): update dependency knip to v2.30.1 2 years ago
Owncast b66155dfdd Bundle embedded web app 2 years ago
Owncast 40921d64a7 Commit screenshots 2 years ago
renovate[bot] 6bdcd755d8
chore(deps): update dependency eslint to v8.50.0 2 years ago
Owncast dfa8303008 Bundle embedded web app 2 years ago
Patrick Bollinger e59167deaa
Stop Firefox from adding mysterious hash (#3348) 2 years ago
Owncast af276e4c39 Bundle embedded web app 2 years ago
renovate[bot] 9556d15ac5
chore(deps): update dependency cypress to v13.3.0 2 years ago
Gabe Kangas bbbaca4123
chore(tests): temp comment out a couple config tests that are breaking due to race conditions 2 years ago
Gabe Kangas 8e79e2acfa
chore(go): run betteralign and gofumpt on codebase 2 years ago
Owncast a31179b604 Bundle embedded web app 2 years ago
renovate[bot] e62e7f528b
chore(deps): update dependency @babel/core to v7.23.0 2 years ago
Owncast 5474422b6d Bundle embedded web app 2 years ago
renovate[bot] adca5221f4
fix(deps): update dependency @uiw/react-codemirror to v4.21.19 2 years ago
Owncast f0a202f7a4 Bundle embedded web app 2 years ago
renovate[bot] 250b82be11
fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.21.19 2 years ago
Owncast 607e585d98 Bundle embedded web app 2 years ago
renovate[bot] 8279a992a6
fix(deps): update dependency @fontsource/inter to v5.0.12 2 years ago
Owncast 58f4429f46 Bundle embedded web app 2 years ago
renovate[bot] a4264b8223
chore(deps): update typescript-eslint monorepo to v6.7.4 2 years ago
Owncast 5fc264c9e4 Commit screenshots 2 years ago
Owncast 6eeb6b9bdc Bundle embedded web app 2 years ago
renovate[bot] b907aa6d7d
chore(deps): update dependency @types/react to v18.2.25 (#3318) 2 years ago
Owncast 570ca8cc7f Bundle embedded web app 2 years ago
renovate[bot] a63fb4cd17
chore(deps): update dependency @types/video.js to v7.3.53 (#3345) 2 years ago
Owncast caf8c44666 Bundle embedded web app 2 years ago
renovate[bot] 0035369b7f
chore(deps): update dependency stylelint-config-standard-scss to v11 (#3322) 2 years ago
renovate[bot] 2810580a87
chore(deps): update docker/setup-qemu-action action to v3 (#3323) 2 years ago
Owncast 871f3ea4db Bundle embedded web app 2 years ago
Owncast 5fea637495 Bundle embedded web app 2 years ago
renovate[bot] 7b8ea4cefa
chore(deps): update actions/checkout action to v4 (#3321) 2 years ago
renovate[bot] 53dc3779e0
chore(deps): update tj-actions/changed-files action to v39 (#3324) 2 years ago
Owncast 96fd25439a Bundle embedded web app 2 years ago
renovate[bot] d2afa78537
chore(deps): update dependency chromatic to v7 (#3325) 2 years ago
renovate[bot] 3bb55bf0b3
chore(deps): update dependency npm to v10 (#3326) 2 years ago
Vishal Sharma 1917b15b0a
Update ClientTable.tsx (#3342) 2 years ago
Owncast 08414537be Bundle embedded web app 2 years ago
renovate[bot] 9fc3a607e8
chore(deps): update dependency eslint-plugin-storybook to v0.6.14 2 years ago
Owncast b8088f2636 Bundle embedded web app 2 years ago
renovate[bot] b023a88f27
chore(deps): update dependency @types/sanitize-html to v2.9.1 2 years ago
Owncast 864faccad0 Bundle embedded web app 2 years ago
renovate[bot] 7bf3a49eca
chore(deps): update dependency @types/react-linkify to v1.0.2 2 years ago
Owncast 9c41b27d04 Bundle embedded web app 2 years ago
renovate[bot] 6422d7e797
chore(deps): update dependency @types/node to v18.18.3 2 years ago
Owncast 7032a59a01 Bundle embedded web app 2 years ago
renovate[bot] 715e349591
chore(deps): update dependency @types/markdown-it to v13.0.2 2 years ago
Owncast 962d428a57 Commit screenshots 2 years ago
Owncast fff003c0c0 Bundle embedded web app 2 years ago
renovate[bot] 65dbd4a079
chore(deps): update dependency @storybook/testing-library to v0.2.2 2 years ago
renovate[bot] ab35cd6ad1
chore(deps): update alpine docker tag to v3.18.4 2 years ago
renovate[bot] b69e2400d3 chore(deps): update peter-evans/create-or-update-comment digest to e3645dd 2 years ago
renovate[bot] 3b4611e3c9
fix(deps): update module golang.org/x/net to v0.16.0 2 years ago
Owncast a82628b041 Bundle embedded web app 2 years ago
renovate[bot] ab69107de3
fix(deps): update dependency react-virtuoso to v4.6.0 2 years ago
Owncast 393b89f5bb Bundle embedded web app 2 years ago
renovate[bot] 8c876c16ce
chore(deps): update dependency sass to v1.68.0 2 years ago
Owncast 5116825cab Bundle embedded web app 2 years ago
dependabot[bot] 37a296f282
Bump zod and next in /web (#3340) 2 years ago
Owncast 35ee3f3699 Commit screenshots 2 years ago
Owncast b541f8b11e Bundle embedded web app 2 years ago
dependabot[bot] 34211f279e
Bump postcss from 8.4.29 to 8.4.31 in /web (#3336) 2 years ago
renovate[bot] cd508ea81c
fix(deps): update dependency @uiw/react-codemirror to v4.21.18 (#3341) 2 years ago
Owncast b8b2d53be9 Bundle embedded web app 2 years ago
renovate[bot] c6fcce9dd4
fix(deps): update dependency autoprefixer to v10.4.16 2 years ago
Owncast 334f9fa026 Bundle embedded web app 2 years ago
renovate[bot] e6661eb764
fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.21.18 2 years ago
Owncast 7060e2ae35 Bundle embedded web app 2 years ago
renovate[bot] e55574bc78
fix(deps): update dependency sharp to v0.32.6 (#3320) 2 years ago
Owncast b812e8edd6 Bundle embedded web app 2 years ago
renovate[bot] 31ccb0e308 chore(deps): update typescript-eslint monorepo to v6.7.3 2 years ago
Owncast e4aae5de00 Bundle embedded web app 2 years ago
renovate[bot] b2038c69c0 chore(deps): update dependency @types/prop-types to v15.7.8 2 years ago
Owncast efdecefc02 Bundle embedded web app 2 years ago
renovate[bot] 7aa8659d6f
chore(deps): update dependency @types/node to v18.18.1 2 years ago
Gabe Kangas 5b579b2a51
Remove install request of chrome for unavailable version 2 years ago
Gabe Kangas 3d120e8868
Specify old version of chrome that is not broken 2 years ago
Owncast 47dc18e0fa Commit screenshots 2 years ago
Gabe Kangas 8a32da05b4
Get updated version of chrome that doesn't break test 2 years ago
Owncast 02ce251bc4 Commit screenshots 2 years ago
Owncast 9070411827 Commit screenshots 2 years ago
Owncast 753602d667 Commit screenshots 2 years ago
Owncast 34c18be8b6 Commit screenshots 2 years ago
Owncast bcc0531dcb Commit screenshots 2 years ago
Owncast eba4358825 Commit screenshots 2 years ago
Owncast a42e782133 Commit screenshots 2 years ago
Owncast 1cafc5713e Commit screenshots 2 years ago
Owncast 3ff7645606 Commit screenshots 2 years ago
Owncast fe0b0c2501 Commit screenshots 2 years ago
Owncast 16e284575f Commit screenshots 2 years ago
Owncast affde60c76 Commit screenshots 2 years ago
renovate[bot] 06be1d8d6f
fix(deps): update module github.com/aws/aws-sdk-go to v1.45.14 2 years ago
Owncast d7d48dc459 Bundle embedded web app 2 years ago
janWilejan f762d7d65b
Add offline option to bundle web.sh (#3202) 2 years ago
Gabe Kangas 5748fe1b92
chore: rename web package 2 years ago
Gabe Kangas 03b785fbe2
fix: remove whitespace to resolve linter warning 2 years ago
Tom Funken e375ea232a
Renamed rewriteRemotePlaylist (#3313) 2 years ago
Owncast 75dcd6c0a6 Commit screenshots 2 years ago
renovate[bot] 766900ffc0
chore(deps): update peter-evans/create-or-update-comment digest to 46da6c0 2 years ago
Owncast 0ac52b015c Commit screenshots 2 years ago
Owncast 48d5c17bd6 Bundle embedded web app 2 years ago
renovate[bot] f87214719d
chore(deps): update dependency @babel/core to v7.22.20 2 years ago
Owncast e63dafa94a Bundle embedded web app 2 years ago
renovate[bot] 39a98e9bbe
chore(deps): update dependency @types/node to v18.17.17 2 years ago
Owncast 6e0e80c765 Commit screenshots 2 years ago
Owncast 172eb0ab49 Bundle embedded web app 2 years ago
renovate[bot] d2c8a6ce28
chore(deps): lock file maintenance (#3314) 2 years ago
Owncast a2a2b2aa2f Bundle embedded web app 2 years ago
renovate[bot] c1193617ce
chore(deps): update dependency @types/node to v18.17.16 2 years ago
Owncast b6c0ecf3fc Bundle embedded web app 2 years ago
renovate[bot] e5e8b3df52
chore(deps): update dependency @storybook/testing-library to v0.2.1 2 years ago
Owncast 69ff466594 Commit screenshots 2 years ago
Owncast 6a99f07ada Bundle embedded web app 2 years ago
renovate[bot] 52f275ecdb
chore(deps): update dependency @babel/core to v7.22.19 2 years ago
Owncast e5d7d694e4 Bundle embedded web app 2 years ago
renovate[bot] bb57b4395a
chore(deps): update dependency knip to v2.24.1 2 years ago
Owncast ba34872f53 Bundle embedded web app 2 years ago
renovate[bot] 6dc850697f
fix(deps): update dependency @codemirror/lang-markdown to v6.2.1 2 years ago
Owncast 1ea167249d Bundle embedded web app 2 years ago
renovate[bot] 90709c3279
chore(deps): update dependency sass to v1.67.0 2 years ago
Owncast 3f3873936b Commit screenshots 2 years ago
Owncast 753433faee Commit screenshots 2 years ago
Owncast c2c6f4fd0b Bundle embedded web app 2 years ago
renovate[bot] 4089a0e5fb
chore(deps): update dependency knip to v2.24.0 2 years ago
Owncast 47f9169d99 Bundle embedded web app 2 years ago
renovate[bot] 622cfed4cc
chore(deps): update dependency knip to v2.23.0 2 years ago
Owncast bcaf3c90d5 Commit screenshots 2 years ago
Owncast 2a5186add5 Bundle embedded web app 2 years ago
dependabot[bot] 99362f7dba
Bump @cypress/request and cypress in /web (#3310) 2 years ago
Owncast 16ce7e0d28 Bundle embedded web app 2 years ago
renovate[bot] 677944da12
chore(deps): update typescript-eslint monorepo to v6.7.0 2 years ago
Owncast 7b4af220d0 Commit screenshots 2 years ago
renovate[bot] 667f9a8c69
chore(deps): update peter-evans/create-or-update-comment digest to 1f6c514 2 years ago
Owncast 51e494c8e2 Commit screenshots 2 years ago
Owncast 98645ba318 Bundle embedded web app 2 years ago
renovate[bot] 2abf2fd100
fix(deps): update dependency ua-parser-js to v1.0.36 2 years ago
Owncast 870b20e4f8 Bundle embedded web app 2 years ago
renovate[bot] c6fb8894d7
chore(deps): update dependency eslint to v8.49.0 2 years ago
Owncast ca2923949d Bundle embedded web app 2 years ago
renovate[bot] a2af0ec5ce
chore(deps): update dependency @types/node to v18.17.15 2 years ago
Owncast 4ec9b786b2 Bundle embedded web app 2 years ago
renovate[bot] c73f0cdb12
chore(deps): update dependency @babel/core to v7.22.17 2 years ago
Owncast 73f656b727 Bundle embedded web app 2 years ago
renovate[bot] 0e04578f62 chore(deps): lock file maintenance 2 years ago
Owncast 187eb43a11 Commit screenshots 2 years ago
Owncast e3639843cf Bundle embedded web app 2 years ago
Tiffany 9094ade2c0
Handle error thrown in postConfigUpdateToAPI (#3299) 2 years ago
Owncast d4428d168b Bundle embedded web app 2 years ago
Gabe Kangas 169c11596c
feat(chat): add support for chat part messages. Closes #3201 (#3291) 2 years ago
dependabot[bot] fb0ac492b2
Bump fast-xml-parser and artillery in /test/load (#3300) 2 years ago
Owncast 570787ee8c Bundle embedded web app 2 years ago
renovate[bot] 87f0ca748f
chore(deps): update dependency knip to v2.22.0 2 years ago
Owncast 57a66c9a17 Commit screenshots 2 years ago
Owncast 4e7b2db85d Bundle embedded web app 2 years ago
renovate[bot] fd7b0e63ae
fix(deps): update dependency react-virtuoso to v4.5.1 2 years ago
Owncast 097c6898d1 Bundle embedded web app 2 years ago
renovate[bot] 8bcdea7d40
fix(deps): update dependency antd to v4.24.14 2 years ago
Owncast 4be4d984db Commit screenshots 2 years ago
Owncast 4e9cb61a60 Bundle embedded web app 2 years ago
renovate[bot] 1e4bfc0eba
chore(deps): update dependency knip to v2.21.2 2 years ago
Owncast 204cc2cb4d Commit screenshots 2 years ago
Owncast 53740562af Bundle embedded web app 2 years ago
renovate[bot] f7f62437c7
chore(deps): update typescript-eslint monorepo to v6.6.0 2 years ago
Owncast c24c8d3f01 Bundle embedded web app 2 years ago
renovate[bot] 679bc3f329
chore(deps): update dependency @types/chart.js to v2.9.38 2 years ago
Owncast a0977e9454 Bundle embedded web app 2 years ago
renovate[bot] bef2a86eb7
chore(deps): update dependency @babel/core to v7.22.15 2 years ago
renovate[bot] 0eecd1a5f4
fix(deps): update module github.com/cafxx/httpcompression to v0.0.9 2 years ago
Owncast bacd549ae9 Commit screenshots 2 years ago
Shreyas 062de79920
Block Private URLs at `serverurl` API endpoint (#3295) 2 years ago
renovate[bot] 50c4c1a5c7
chore(deps): update peter-evans/create-or-update-comment digest to 223779b 2 years ago
Owncast 26356615bb Commit screenshots 2 years ago
Owncast cfb42fd44f Bundle embedded web app 2 years ago
renovate[bot] d1d2c364bb
chore(deps): update dependency @types/node to v18.17.14 2 years ago
renovate[bot] 91fd9a9c99
chore(deps): update peter-evans/create-or-update-comment digest to 46846e5 2 years ago
Owncast ad976a9745 Commit screenshots 2 years ago
renovate[bot] 4f2957a784
fix(deps): update dependency @uiw/react-codemirror to v4.21.13 2 years ago
Owncast 45bdc85160 Bundle embedded web app 2 years ago
renovate[bot] 2a017930c7
chore(deps): update dependency @types/node to v18.17.13 2 years ago
Owncast 5ac3326f37 Bundle embedded web app 2 years ago
renovate[bot] 7d816c527e
fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.21.13 2 years ago
renovate[bot] f0a3bc54d1 chore(deps): lock file maintenance 2 years ago
Owncast 2be46ff43f Commit screenshots 2 years ago
Owncast 4194a126eb Bundle embedded web app 2 years ago
renovate[bot] c82ebc178e
chore(deps): update dependency knip to v2.21.1 2 years ago
Owncast 274771462f Commit screenshots 2 years ago
Owncast 9d9c140df6 Bundle embedded web app 2 years ago
renovate[bot] 10bbf145c0
chore(deps): update dependency @types/ua-parser-js to v0.7.37 2 years ago
Owncast 194c99f314 Bundle embedded web app 2 years ago
renovate[bot] 92e6b72a97
chore(deps): update dependency knip to v2.21.0 2 years ago
Owncast 8d6d20d115 Commit screenshots 2 years ago
Owncast 0d84b0de43 Bundle embedded web app 2 years ago
renovate[bot] 580ab9e216
fix(deps): update dependency @uiw/react-codemirror to v4.21.12 2 years ago
Owncast 997755e49d Bundle embedded web app 2 years ago
renovate[bot] caa229ae03
fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.21.12 2 years ago
Owncast d242cc76a1 Bundle embedded web app 2 years ago
renovate[bot] ab37b9dc7a
chore(deps): update dependency prettier to v3.0.3 2 years ago
Owncast 8ce17312c5 Commit screenshots 2 years ago
Owncast b9021ae162 Bundle embedded web app 2 years ago
renovate[bot] f357b1bd5e
chore(deps): update typescript-eslint monorepo to v6.5.0 2 years ago
Owncast 85e1c3af55 Bundle embedded web app 2 years ago
renovate[bot] f4cd4d7368
fix(deps): update codemirror 2 years ago
Owncast 714a62e49e Bundle embedded web app 2 years ago
renovate[bot] b6367a227d
fix(deps): update dependency yaml to v2.3.2 2 years ago
Owncast ae4cf81ad0 Bundle embedded web app 2 years ago
renovate[bot] e2b07c28c7
chore(deps): update dependency knip to v2.20.2 2 years ago
Owncast bf895ca1d8 Commit screenshots 2 years ago
Owncast fa818b6b2f Bundle embedded web app 2 years ago
renovate[bot] def783a440
chore(deps): update dependency @types/node to v18.17.12 2 years ago
renovate[bot] d2f9f803ee
chore(deps): update peter-evans/create-or-update-comment digest to 94ff342 (#3287) 2 years ago
renovate[bot] 2b0fd5df7a fix(deps): update module github.com/aws/aws-sdk-go to v1.44.334 2 years ago
Owncast a910a05738 Bundle embedded web app 2 years ago
renovate[bot] 6447b827c8
fix(deps): update dependency @codemirror/lang-javascript to v6.2.0 2 years ago
Owncast c77a0a7894 Commit screenshots 2 years ago
Owncast 96dfac2865 Bundle embedded web app 2 years ago
renovate[bot] 9e5d39c00c
chore(deps): update dependency knip to v2.20.1 2 years ago
Owncast ae48198d8d Bundle embedded web app 2 years ago
renovate[bot] f86a707cb3
chore(deps): update dependency @types/markdown-it to v13.0.1 2 years ago
Owncast b5e4f30e90 Bundle embedded web app 2 years ago
renovate[bot] 68d67bef85
fix(deps): update dependency @uiw/react-codemirror to v4.21.11 2 years ago
Owncast 38c017a24b Bundle embedded web app 2 years ago
renovate[bot] 50a6bfaeea
fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.21.11 2 years ago
Owncast 745df2cca2 Commit screenshots 2 years ago
Owncast cfa0d2b718 Bundle embedded web app 2 years ago
renovate[bot] a3df90bc89
chore(deps): update dependency eslint to v8.48.0 2 years ago
Owncast e68d1e74e3 Bundle embedded web app 2 years ago
renovate[bot] 33a9c80e17
fix(deps): update dependency @uiw/react-codemirror to v4.21.10 2 years ago
Owncast 072a8c0498 Bundle embedded web app 2 years ago
renovate[bot] 994ad17d8d
fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.21.10 2 years ago
Owncast f30acd798d Bundle embedded web app 2 years ago
renovate[bot] e0bfdfb9b6
chore(deps): update dependency chromatic to v6.24.1 2 years ago
Owncast a00440ce67 Bundle embedded web app 2 years ago
renovate[bot] ff17b59104
chore(deps): update dependency mermaid to v10.4.0 2 years ago
Owncast ec61b255c4 Bundle embedded web app 2 years ago
renovate[bot] 62d78a03e7
chore(deps): update dependency @types/node to v18.17.11 2 years ago
Gabe Kangas 974ec15b5d
fix: export correct timestamps on build artifacts. Closes #3282 2 years ago
Owncast 0694dad4c7 Commit screenshots 2 years ago
Owncast 11df231f88 Bundle embedded web app 2 years ago
renovate[bot] 308c683bc9
fix(deps): update dependency chart.js to v4.4.0 2 years ago
Owncast b5f24dcbd3 Bundle embedded web app 2 years ago
renovate[bot] 3518f1a00f
chore(deps): update dependency chromatic to v6.24.0 2 years ago
Owncast d64d64ced5 Bundle embedded web app 2 years ago
renovate[bot] ae6203657e
chore(deps): update dependency @babel/core to v7.22.11 2 years ago
Owncast b35813d928 Commit screenshots 2 years ago
Owncast b8694c3629 Bundle embedded web app 2 years ago
renovate[bot] 1fc61b8512
chore(deps): update dependency @types/node to v18.17.9 2 years ago
renovate[bot] 74846e00a3
chore(deps): update tj-actions/changed-files action to v38 (#3280) 2 years ago
renovate[bot] c298f276c1
fix(deps): update module github.com/aws/aws-sdk-go to v1.44.332 2 years ago
Owncast 67f5f6479d Bundle embedded web app 2 years ago
renovate[bot] 3471b923ec
chore(deps): update dependency knip to v2.19.11 2 years ago
Owncast b2f82fdcbc Bundle embedded web app 2 years ago
renovate[bot] 0185cf605b
chore(deps): update typescript-eslint monorepo to v6.4.1 (#3274) 2 years ago
Owncast 8ae1807680 Bundle embedded web app 2 years ago
renovate[bot] 11bfd01a18
chore(deps): update dependency chromatic to v6.23.0 (#3276) 2 years ago
Owncast 3e256da143 Commit screenshots 2 years ago
Owncast 1431a9b9c8 Bundle embedded web app 2 years ago
renovate[bot] ca6c3e2d18
chore(deps): update dependency @types/jest to v29.5.4 (#3278) 2 years ago
renovate[bot] 68a3c7d2f4
chore(deps): update peter-evans/create-or-update-comment digest to 8c21c80 (#3272) 2 years ago
renovate[bot] 4786df39eb
chore(deps): update dependency @types/react to v18.2.21 (#3279) 2 years ago
Gabe Kangas 3174eb20e5
fix: updates for new linter rules. Closes #3277 2 years ago
Owncast 718b76fcc2 Bundle embedded web app 2 years ago
renovate[bot] a66dc01d2e
chore(deps): update dependency @types/node to v18.17.8 (#3275) 2 years ago
Owncast 63ef0b6cec Bundle embedded web app 2 years ago
renovate[bot] 1be4cba4fd
chore(deps): update dependency knip to v2.19.9 2 years ago
Owncast 39e5365226 Commit screenshots 2 years ago
Owncast c943003f9a Bundle embedded web app 2 years ago
renovate[bot] 54abcf1b54
chore(deps): update dependency knip to v2.19.8 2 years ago
Owncast 4ff4297d0a Commit screenshots 2 years ago
Owncast 63475d1efd Commit screenshots 2 years ago
Owncast 5c261c213e Bundle embedded web app 2 years ago
renovate[bot] 3a561e0853
chore(deps): update dependency sass to v1.66.1 (#3269) 2 years ago
Owncast 316c51fd09 Commit screenshots 2 years ago
Owncast fcb3178a77 Bundle embedded web app 2 years ago
renovate[bot] 4e1f67d84d
chore(deps): update nextjs monorepo to v13.4.19 2 years ago
Owncast c8bc5f8121 Bundle embedded web app 2 years ago
renovate[bot] 779c5805cf
chore(deps): update dependency @types/node to v18.17.6 2 years ago
Owncast 327b457533 Bundle embedded web app 2 years ago
renovate[bot] d36589333c chore(deps): lock file maintenance 2 years ago
Owncast c52a5a60b9 Bundle embedded web app 2 years ago
renovate[bot] b93c826616
chore(deps): update nextjs monorepo to v13.4.18 2 years ago
Owncast 4421d4a4f9 Commit screenshots 2 years ago
Owncast 2851dbc05f Bundle embedded web app 2 years ago
renovate[bot] 6be6a65153
chore(deps): update dependency sass to v1.66.0 2 years ago
Gabe Kangas b51829a0a7
chore(ci): fix duplicate runs of bundle step 2 years ago
Owncast bea4a50caa Bundle embedded web app 2 years ago
Owncast 1d85b0c60a Bundle embedded web app 2 years ago
renovate[bot] d0984d13c7
chore(deps): update nextjs monorepo to v13.4.17 2 years ago
Owncast 52ea7255e4 Commit screenshots 2 years ago
renovate[bot] ef75730aa7
fix(deps): update module golang.org/x/net to v0.14.0 2 years ago
Owncast e6c322fa3b Bundle embedded web app 2 years ago
Owncast c7a9a67812 Bundle embedded web app 2 years ago
renovate[bot] db9448d324
chore(deps): update dependency chromatic to v6.22.0 2 years ago
Owncast c8a02df484 Bundle embedded web app 2 years ago
Owncast 05834422a8 Bundle embedded web app 2 years ago
renovate[bot] 669862908e
chore(deps): update dependency eslint-plugin-react to v7.33.2 2 years ago
Owncast 9683081bb0 Bundle embedded web app 2 years ago
Owncast 9177c98010 Bundle embedded web app 2 years ago
renovate[bot] 8b2ff05dc5
chore(deps): update typescript-eslint monorepo to v6 (#3265) 2 years ago
Owncast 895378799f Bundle embedded web app 2 years ago
Gabe Kangas 8cb4103f3f
chore(ci): cancel other build runs on duplicat 2 years ago
Owncast d5e3c784eb Bundle embedded web app 2 years ago
Owncast 468cdea069 Bundle embedded web app 2 years ago
Owncast dd6b94cfd7 Bundle embedded web app 2 years ago
renovate[bot] 3c23bfbedb
chore(deps): update dependency mdx-mermaid to v2 (#3264) 2 years ago
renovate[bot] 1ff26ee671
chore(deps): update dependency @svgr/webpack to v8 (#3262) 2 years ago
renovate[bot] 9c442d62b5
chore(deps): update dependency eslint-config-prettier to v9 (#3263) 2 years ago
Owncast cd196267bb Bundle embedded web app 2 years ago
Owncast 45abcdb98a Bundle embedded web app 2 years ago
renovate[bot] b0ebfba93a
chore(deps): update dependency @types/markdown-it to v13 (#3261) 2 years ago
Owncast f3f6251208 Commit screenshots 2 years ago
Owncast c5a5e96866 Bundle embedded web app 2 years ago
Owncast c8035cc4d7 Bundle embedded web app 2 years ago
renovate[bot] 100aef5286
chore(deps): lock file maintenance (#3257) 2 years ago
Gabe Kangas c28d254a96
chore(ci): push_request_target -> push_request 2 years ago
Gabe Kangas 7e7d2660d0
fix(test): select all wasn't working, making the display name typed in too long 2 years ago
renovate[bot] 759796d81e
fix(deps): update module github.com/aws/aws-sdk-go to v1.44.327 2 years ago
Owncast bf25373f28 Bundle embedded web app 2 years ago
Owncast 2267d717ae Bundle embedded web app 2 years ago
renovate[bot] 6afdcc7905
fix(deps): update dependency sharp to v0.32.5 2 years ago
Owncast 1e1fa04d99 Bundle embedded web app 2 years ago
Owncast f85f1daba0 Bundle embedded web app 2 years ago
renovate[bot] 1c620ae023
chore(deps): update dependency cypress to v12.17.4 2 years ago
renovate[bot] 146f8a9ae5
fix(deps): update module github.com/shirou/gopsutil/v3 to v3.23.7 2 years ago
Owncast 618d2b81af Bundle embedded web app 2 years ago
Owncast acbd13562d Bundle embedded web app 2 years ago
renovate[bot] a69edd3efe
chore(deps): update dependency prettier to v3.0.2 2 years ago
renovate[bot] 981411029c
fix(deps): update module github.com/yuin/goldmark to v1.5.6 2 years ago
Owncast 012d45455f Bundle embedded web app 2 years ago
Owncast 291793e300 Bundle embedded web app 2 years ago
renovate[bot] d4bbbed05d
fix(deps): update dependency video.js to v8.5.2 2 years ago
Owncast 73484e7872 Bundle embedded web app 2 years ago
Owncast 8ef1605267 Bundle embedded web app 2 years ago
renovate[bot] 1bd75d11ee
fix(deps): update nextjs monorepo to v13.4.16 2 years ago
Owncast 3de8478f70 Commit screenshots 2 years ago
Owncast d6c59b10d5 Bundle embedded web app 2 years ago
Owncast aa70e2082b Bundle embedded web app 2 years ago
Gabe Kangas 364afd0e71
fix: add spacing between user badges. Closes #3247 2 years ago
Gabe Kangas 78cda4b8db
chore: manually build web project 2 years ago
Owncast 50f306fe7a Bundle embedded web app 2 years ago
Owncast eef687a380 Bundle embedded web app 2 years ago
renovate[bot] fe19aa4c77
fix(deps): update nextjs monorepo to v13.4.15 2 years ago
Owncast 004b6f4a1e Commit screenshots 2 years ago
Gabe Kangas ef14067044 fix: support arm64 darwin builds for Apple Silicon. For #3056 2 years ago
Gabe Kangas 1e57cff3e0
fix: use lightweight bot/scraper html responses. Fixes #3253 2 years ago
Gabe Kangas 78ec6302b9
fix(ci): add untracked files before rebase. For #3255 2 years ago
Owncast 4bd813a0be Bundle embedded web app 2 years ago
Gabe Kangas 5ac0d5bbca
feat(admin): add explicit directory info agreement modal. Closes #3258 2 years ago
Owncast f3f93c8d08 Bundle embedded web app 2 years ago
Owncast ca4123cc5c Bundle embedded web app 2 years ago
renovate[bot] 18a3ac87ad
fix(deps): update dependency autoprefixer to v10.4.15 2 years ago
renovate[bot] 0aa98943ae
chore(deps): update peter-evans/create-or-update-comment digest to bb291f6 2 years ago
Owncast f0be9ea119 Commit screenshots 2 years ago
dependabot[bot] 88c614f6e1
Bump protobufjs from 6.11.3 to 6.11.4 in /test/load (#3259) 2 years ago
Owncast e79d9dfd3c Commit screenshots 2 years ago
Owncast c4c10da99d Bundle embedded web app 2 years ago
Owncast 59f6c36c31 Bundle embedded web app 2 years ago
renovate[bot] 96cfc2826e
chore(deps): update dependency @types/node to v18.17.5 2 years ago
Owncast 8ea00e76dc Bundle embedded web app 2 years ago
Owncast 3f92046d57 Bundle embedded web app 2 years ago
renovate[bot] ab29024f52
chore(deps): update dependency eslint to v8.47.0 2 years ago
Owncast fe9fbfb79c Bundle embedded web app 2 years ago
Owncast bd0dbb96b7 Bundle embedded web app 2 years ago
renovate[bot] 2d7522c8e4
chore(deps): update dependency mermaid to v10.3.1 2 years ago
Owncast c3797c9b96 Bundle embedded web app 2 years ago
Owncast ab170b0a11 Bundle embedded web app 2 years ago
renovate[bot] 98f67b1cd0
chore(deps): update dependency knip to v2.19.3 2 years ago
Owncast 1439cfb9fc Commit screenshots 2 years ago
Owncast a818095e5d Bundle embedded web app 2 years ago
renovate[bot] 437878eee2
fix(deps): update dependency react-error-boundary to v4.0.11 2 years ago
John Regan a703df5182
Check if proposed name change is an API name (#3256) 2 years ago
Owncast 322c0d52bc Bundle embedded web app 2 years ago
Owncast 8e79760825 Bundle embedded web app 2 years ago
renovate[bot] 38bb389cce
chore(deps): update dependency knip to v2.19.2 2 years ago
Owncast 6882728635 Bundle embedded web app 2 years ago
renovate[bot] 629cb8b52e
fix(deps): update dependency @ant-design/icons to v4.8.1 2 years ago
Owncast 42698f0062 Commit screenshots 2 years ago
Owncast 6013a37553 Bundle embedded web app 2 years ago
Owncast a7d597cf8d Bundle embedded web app 2 years ago
renovate[bot] 41851123f6
chore(deps): update dependency sass to v1.65.1 2 years ago
Gabe Kangas 845051c4c2
chore: rebase before commit bundled web app 2 years ago
Owncast 003a1dad62 Bundle embedded web app 2 years ago
renovate[bot] 7b0895c423
chore(deps): update dependency @types/react to v18.2.20 2 years ago
Owncast 611f44e72b Bundle embedded web app 2 years ago
renovate[bot] bc7f667ff8
fix(deps): update dependency react-virtuoso to v4.5.0 2 years ago
Gabe Kangas 1618ab8645
chore: update formatting based on updated linting rules 2 years ago
Gabe Kangas 1a7b6b99d5
feat(storage): support a object storage custom path prefix 2 years ago
Owncast d5c54aacc1 Commit screenshots 2 years ago
Owncast 17f23436b6 Bundle embedded web app 2 years ago
renovate[bot] c3e488e321
chore(deps): update dependency @types/node to v18.17.4 2 years ago
Owncast 18df448552 Bundle embedded web app 2 years ago
renovate[bot] 0521489d94
chore(deps): update dependency knip to v2.19.1 2 years ago
Owncast dc6b9de8ba Bundle embedded web app 2 years ago
renovate[bot] 493b3744e8
chore(deps): update dependency @types/react to v18.2.19 2 years ago
Owncast 369f1cdd6a Commit screenshots 2 years ago
Owncast 187cb1ae98 Bundle embedded web app 2 years ago
renovate[bot] 00e27a8c3f
chore(deps): update dependency @babel/core to v7.22.10 2 years ago
Owncast 497982c19c Bundle embedded web app 2 years ago
renovate[bot] bedb293a7e
chore(deps): update dependency chromatic to v6.21.0 2 years ago
Owncast 9ebb8ded54 Bundle embedded web app 2 years ago
renovate[bot] c7a70450e0
chore(deps): update nextjs monorepo to v13.4.13 2 years ago
Owncast 6efc88929c Commit screenshots 2 years ago
renovate[bot] d1fbfda234
chore(deps): update peter-evans/create-or-update-comment digest to 5f22cb8 2 years ago
Owncast 72a81f3fd2 Bundle embedded web app 2 years ago
renovate[bot] 83f1e3841f
fix(deps): update dependency @fontsource/poppins to v5.0.8 2 years ago
Owncast e050fe5265 Commit screenshots 2 years ago
Owncast 39146e02a2 Bundle embedded web app 2 years ago
renovate[bot] 16e78d80e1
chore(deps): update dependency less to v4.2.0 2 years ago
Owncast 1a7c5a4d85 Bundle embedded web app 2 years ago
renovate[bot] 9f61fdbc4a
chore(deps): update dependency @types/node to v18.17.3 2 years ago
Owncast b2513b56f6 Commit screenshots 2 years ago
Owncast 76afbdb50a Bundle embedded web app 2 years ago
renovate[bot] c9196b2320
fix(deps): update dependency @codemirror/lang-css to v6.2.1 2 years ago
renovate[bot] 72c2ec8006
chore(deps): update alpine docker tag to v3.18.3 2 years ago
Owncast 5e2e08de2e Bundle embedded web app 2 years ago
renovate[bot] 81a37dc572
chore(deps): lock file maintenance (#3244) 2 years ago
Owncast 7318de577b Bundle embedded web app 2 years ago
renovate[bot] 868ac0507d
chore(deps): lock file maintenance (#3243) 2 years ago
Owncast 2570fc75ce Bundle embedded web app 2 years ago
dependabot[bot] e2d8072957
Bump tough-cookie and @cypress/request in /web (#3242) 2 years ago
dependabot[bot] 655f049769
Bump tough-cookie and @cypress/request in /test/automated/browser (#3241) 2 years ago
Owncast 3a4614ef82 Commit screenshots 2 years ago
Owncast 2fa20fa96a Bundle embedded web app 2 years ago
renovate[bot] 78db21c36f
chore(deps): update dependency @types/node to v18.17.2 2 years ago
Owncast 2c26e66d2f Bundle embedded web app 2 years ago
renovate[bot] 301207fc0b
fix(deps): update fontsource monorepo to v5.0.7 2 years ago
Owncast 6eb8003367 Bundle embedded web app 2 years ago
renovate[bot] bab9483a74
chore(deps): update dependency eslint-config-prettier to v8.10.0 2 years ago
Owncast 215845edcc Bundle embedded web app 2 years ago
renovate[bot] 20674f8781
fix(deps): update dependency antd to v4.24.13 2 years ago
Owncast 6dca37460e Bundle embedded web app 2 years ago
renovate[bot] 3eea33f489
chore(deps): update dependency prettier to v3.0.1 2 years ago
Owncast c07adaa446 Bundle embedded web app 2 years ago
renovate[bot] 2ef9e9b988
fix(deps): update dependency chart.js to v4.3.3 2 years ago
Owncast c1ece93d24 Bundle embedded web app 2 years ago
renovate[bot] f97ebec14e
fix(deps): update fontsource monorepo to v5.0.6 2 years ago
Owncast 2f9b5c8f8c Bundle embedded web app 2 years ago
renovate[bot] cb8b0ff005
chore(deps): update dependency knip to v2.17.3 2 years ago
Owncast d9df66ee23 Bundle embedded web app 2 years ago
renovate[bot] d4a4261243
chore(deps): update dependency handlebars to v4.7.8 2 years ago
Owncast 2f2b7caff5 Bundle embedded web app 2 years ago
renovate[bot] 8bbb9024bb
chore(deps): update dependency cypress to v12.17.3 2 years ago
Gabe Kangas 0fba5f70e2
feat(video): add IP address to RTMP logs. Closes #3212 (#3233) 2 years ago
Owncast afac6ee886 Bundle embedded web app 2 years ago
renovate[bot] 5b77513421
chore(deps): update dependency sass to v1.64.2 (#3237) 2 years ago
Gabe Kangas e166e009aa
fix: verify object and actor exists in Like request. Closes #3223 (#3232) 2 years ago
Gabe Kangas c9298def5b
Cleanup object storage files on success or failure (#3231) 2 years ago
Owncast 050028e72d Bundle embedded web app 2 years ago
Gabe Kangas e3dc63994b
chore: only push changes on develop branch 2 years ago
renovate[bot] 4be2d109f2
chore(deps): update dependency knip to v2.17.2 (#3236) 2 years ago
Gabe Kangas e1deb08c8c
chore: js lint. use autostash when rebasing 2 years ago
Owncast 525df731f5 Bundle embedded web app 2 years ago
renovate[bot] d55027f49b
chore(deps): update dependency @types/react to v18.2.18 (#3235) 2 years ago
Gabe Kangas 401d0bb44e
chore: manually pull, rebase, and push 2 years ago
Owncast 6b9e070811 Bundle embedded web app 2 years ago
Gabe Kangas 243156b307
chore: address linter warnings 2 years ago
Gabe Kangas d3c5e14aa0
chore: update eslint-plugin-prettier 2 years ago
Owncast 0a3313825b Bundle embedded web app 2 years ago
janWilejan c00b0be3d4
fix emojis overflowing the chat message (#3228) 2 years ago
renovate[bot] 66fa8866f6
chore(deps): update peter-evans/create-or-update-comment digest to 38217c6 2 years ago
Owncast f6d8018249 Bundle embedded web app 2 years ago
renovate[bot] 8c12e86a01
chore(deps): update dependency eslint-plugin-react to v7.33.1 2 years ago
Gabe Kangas d5013e9b61
fix: force ignoring of certain paths? 2 years ago
Gabe Kangas cab45f0be8
chore: force js formatting to occur before building/bundling 2 years ago
Owncast 27560ef6a9 Bundle embedded web app 2 years ago
Owncast 0c619420d6 Bundle embedded web app 2 years ago
Gabe Kangas 48652ac12c
fix: be explicit about what dir we want to know has changed files 2 years ago
Owncast b0f9c717ba Bundle embedded web app 2 years ago
Gabe Kangas 3ae0367bec
fix: fix CI js linting? 2 years ago
Owncast f8ea174b79 Bundle embedded web app 2 years ago
renovate[bot] ee856a4f7a
fix(deps): update module github.com/yuin/goldmark to v1.5.5 2 years ago
Owncast 218ce154af Bundle embedded web app 2 years ago
Gabe Kangas 00c054a748
fix: do not check against PAT as it is not required 2 years ago
Gabe Kangas 460f47d9b7
fix: update use of changed files to specify proper key 2 years ago
Owncast 8341328df0 Bundle embedded web app 2 years ago
renovate[bot] c22ae15f55
chore(deps): update dependency eslint to v8.46.0 2 years ago
Owncast 9051afcceb Bundle embedded web app 2 years ago
Ikko Eltociear Ashimine 0fb821b33c
Fix typo in actions.tsx (#3225) 2 years ago
Owncast 2d5b2e632f Bundle embedded web app 2 years ago
renovate[bot] 8de29bea77
chore(deps): lock file maintenance (#3224) 2 years ago
Owncast 808d9fdbc3 Bundle embedded web app 2 years ago
renovate[bot] 0f1112432f
fix(deps): update dependency @uiw/react-codemirror to v4.21.9 2 years ago
Owncast c502eb021b Bundle embedded web app 2 years ago
renovate[bot] b3f343c4bd
fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.21.9 2 years ago
Owncast 9ede42c11d Commit screenshots 2 years ago
Owncast 868e8c2523 Bundle embedded web app 2 years ago
renovate[bot] 60c13bd544
chore(deps): update dependency eslint-config-prettier to v8.9.0 2 years ago
Owncast 2052f38d8a Bundle embedded web app 2 years ago
renovate[bot] 8b3d2d5adc
fix(deps): update dependency xstate to v4.38.2 2 years ago
Owncast 9f864c7dff Commit screenshots 2 years ago
Owncast bf62d3a990 Bundle embedded web app 2 years ago
renovate[bot] 4ff73402ef
chore(deps): update dependency prettier to v3 (#3143) 2 years ago
Owncast 8712f0166e Bundle embedded web app 2 years ago
renovate[bot] 7df82a1a9c
chore(deps): update dependency @types/react to v18.2.17 (#3221) 2 years ago
Gabe Kangas a75ea76cc8
chore: only run commit web project build on develop 2 years ago
Owncast e796c6f12c Bundle embedded web app 2 years ago
Owncast 3659a539f0 Bundle embedded web app 2 years ago
Gabe Kangas 8c4ebd26ad
chore: consolidate web build/test jobs and only run it after other steps are successful 2 years ago
Owncast 7150fc5ede Bundle embedded web app 2 years ago
Gabe Kangas a163ab8d96
fix: formatting breaking build 2 years ago
renovate[bot] 7c13a3fd01
chore(deps): update dependency eslint-plugin-react to v7.33.0 (#3205) 2 years ago
Owncast adef11eccf Bundle embedded web app 2 years ago
renovate[bot] 8531bf3d4d
fix(deps): update dependency chart.js to v4.3.2 2 years ago
Owncast 404bf94af6 Bundle embedded web app 2 years ago
renovate[bot] 1566c2df5a
chore(deps): update dependency mermaid to v10.3.0 2 years ago
Owncast cb4d0bb8d7 Bundle embedded web app 2 years ago
renovate[bot] ce70f4cd4a
chore(deps): update dependency knip to v2.17.1 2 years ago
Owncast 9783274f0e Commit screenshots 2 years ago
Owncast df8d78a6d3 Bundle embedded web app 2 years ago
renovate[bot] b7117d2271
chore(deps): update dependency @types/node to v18.17.1 2 years ago
Gabe Kangas 513b59b174
chore: bump version number to 0.1.2 2 years ago
Owncast 103d1684ca Bundle embedded web app 2 years ago
renovate[bot] b9fd47dc91
chore(deps): update dependency knip to v2.17.0 2 years ago
Owncast 737a1f790c Commit screenshots 2 years ago
Owncast de252af232 Bundle embedded web app 2 years ago
renovate[bot] f829855af5
chore(deps): update dependency knip to v2.16.2 2 years ago
Owncast a275a0aa00 Bundle embedded web app 2 years ago
Gabe Kangas 6e3f5d3e9f
fix: fix positioning of mobile buttons menu. Closes #3216 (#3217) 2 years ago
Owncast 2a7388640d Bundle embedded web app 2 years ago
renovate[bot] 1267adebb5
chore(deps): update dependency @types/react to v18.2.16 2 years ago
Owncast bcff57cfd8 Bundle embedded web app 2 years ago
renovate[bot] a277951559
fix(deps): update dependency chart.js to v4.3.1 2 years ago
Owncast 94f36025ba Bundle embedded web app 2 years ago
renovate[bot] 9a243a8c53
fix(deps): update dependency react-virtuoso to v4.4.2 2 years ago
Owncast b968756e32 Commit screenshots 2 years ago
Owncast b893075dd3 Bundle embedded web app 2 years ago
Gabe Kangas 16db7825c9
fix: external actions were assuming all actions are urls. Fixes #3213 2 years ago
renovate[bot] 7575c64d14
chore(deps): update peter-evans/create-or-update-comment digest to 716151b 2 years ago
Owncast 1609ec09e8 Commit screenshots 2 years ago
Owncast 16851463e8 Bundle embedded web app 2 years ago
renovate[bot] 848474227d
chore(deps): update dependency chromatic to v6.20.0 2 years ago
Owncast 630d215b33 Bundle embedded web app 2 years ago
renovate[bot] 4cab2b754b
chore(deps): update dependency @types/node to v18.17.0 2 years ago
Owncast 46011194a4 Bundle embedded web app 2 years ago
renovate[bot] 897da2232b
fix(deps): update dependency @uiw/react-codemirror to v4.21.8 (#3211) 2 years ago
Owncast bdd7711c1b Bundle embedded web app 2 years ago
renovate[bot] a66ab61691 fix(deps): update dependency sharp to v0.32.4 2 years ago
Owncast 001d7efca8 Bundle embedded web app 2 years ago
renovate[bot] 284b8db2f8
fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.21.8 2 years ago
Owncast dc95e9794a Bundle embedded web app 2 years ago
renovate[bot] 3a35571449
chore(deps): update nextjs monorepo to v13.4.12 2 years ago
Owncast 53477e1d61 Commit screenshots 2 years ago
Owncast 3186ac69d1 Bundle embedded web app 2 years ago
renovate[bot] cb1a4a74be
chore(deps): update dependency sass to v1.64.1 2 years ago
Owncast 1190c8b280 Bundle embedded web app 2 years ago
renovate[bot] 79c2697a85
chore(deps): update dependency @types/node to v18.16.20 2 years ago
John Regan b2a80f2149
s3Storage: fix slice bounds out of range error (#3208) 2 years ago
Owncast c90929b544 Bundle embedded web app 2 years ago
renovate[bot] 88361fb32d
chore(deps): update nextjs monorepo to v13.4.11 2 years ago
Owncast 96c12dcf3c Bundle embedded web app 2 years ago
renovate[bot] aedab46da7 chore(deps): lock file maintenance 2 years ago
Owncast f6eb19ce84 Commit screenshots 2 years ago
Owncast 8a2efece47 Bundle embedded web app 2 years ago
renovate[bot] 6c75e2ed55
chore(deps): update dependency cypress to v12.17.2 2 years ago
renovate[bot] 6327011cb4 fix(deps): update github.com/teris-io/shortid digest to 6c56cef 2 years ago
Gabe Kangas 4ed0d8cae4
Update standard-pull-request.md 2 years ago
Gabe Kangas 29326e1767
Delete unused PR template 2 years ago
Owncast 9a89f4b89d Bundle embedded web app 2 years ago
renovate[bot] 10e07dc538
chore(deps): update dependency eslint-plugin-storybook to v0.6.13 2 years ago
Owncast b83669239f Bundle embedded web app 2 years ago
renovate[bot] c176d82394
chore(deps): update dependency npm to v9.8.1 (#3198) 2 years ago
Owncast b0d44230d9 Bundle embedded web app 2 years ago
renovate[bot] fbd7b596fc
chore(deps): update dependency stylelint to v15.10.2 (#3197) 2 years ago
dependabot[bot] b293a93217
Bump word-wrap from 1.2.3 to 1.2.4 in /test/automated/api (#3186) 2 years ago
dependabot[bot] 8b545d496a
Bump word-wrap from 1.2.3 to 1.2.4 in /test/automated/hls (#3187) 2 years ago
renovate[bot] 22773185cc
chore(deps): update dependency sass to v1.64.0 (#3200) 2 years ago
Gabe Kangas 82d5e5c695
Revert "add offline option to bundleWeb.sh (#3193)" 2 years ago
Owncast 8bf46daf63 Commit screenshots 2 years ago
renovate[bot] 2001c944a1 fix(deps): update github.com/teris-io/shortid digest to 71ec9f2 2 years ago
Owncast 2010259c6e Commit screenshots 2 years ago
janWilejan e338da9fa3
add offline option to bundleWeb.sh (#3193) 2 years ago
Owncast 3dafc77140 Bundle embedded web app 2 years ago
janWilejan f112f9813d
NotifyReminderPopup uses a custom Popover (#3194) 2 years ago
janWilejan 42c176f783
Url gets its own paragraph in notification post (#3196) 2 years ago
renovate[bot] 9e92ae46f3
fix(deps): update github.com/teris-io/shortid digest to 6c56cef 2 years ago
Owncast 6d60861640 Bundle embedded web app 2 years ago
renovate[bot] 2899a35d84
fix(deps): update dependency react-virtuoso to v4.4.1 2 years ago
Owncast 92922256a4 Commit screenshots 2 years ago
Owncast 5fbac7ea13 Bundle embedded web app 2 years ago
renovate[bot] 03a69de012
chore(deps): update dependency knip to v2.16.0 2 years ago
renovate[bot] 8eb5b5bb04
fix(deps): update github.com/teris-io/shortid digest to 71ec9f2 2 years ago
Owncast 957914485a Commit screenshots 2 years ago
renovate[bot] ed981cc99a
fix(deps): update github.com/teris-io/shortid digest to 6c56cef 2 years ago
renovate[bot] fe8758d8df
chore(deps): update peter-evans/create-or-update-comment digest to 30a3d62 2 years ago
Owncast 9527897c99 Commit screenshots 2 years ago
Gabe Kangas d0376cdc75
fix: limit the different worker pools to available CPU cores. Should resolve #3189 2 years ago
dependabot[bot] b1381170c1
Bump word-wrap from 1.2.3 to 1.2.4 in /test/load (#3188) 2 years ago
renovate[bot] fc69b24f0d
chore(deps): update peter-evans/create-or-update-comment digest to 5a5a8f5 2 years ago
renovate[bot] 265f1cfea7
fix(deps): update module github.com/microcosm-cc/bluemonday to v1.0.25 2 years ago
Owncast d47314aaf8 Commit screenshots 2 years ago
Owncast 381524cbab Bundle embedded web app 2 years ago
renovate[bot] cf71c46e2d
chore(deps): update dependency eslint to v8.45.0 2 years ago
Owncast 13a1174667 Bundle embedded web app 2 years ago
Gabe Kangas 777da508ed
fix(chat): fix chat not using the correct messages selector. (#3180) 2 years ago
mrsoong b0c50fb8e5
Fixed localhost IP ban (#3183) 2 years ago
Owncast 4b1ad40cb0 Bundle embedded web app 2 years ago
renovate[bot] d67354f590
chore(deps): update dependency eslint-config-next to v13.4.10 (#3184) 2 years ago
Owncast 5a1bbe37a7 Bundle embedded web app 2 years ago
renovate[bot] ac3bfb3449
fix(deps): update dependency sharp to v0.32.3 2 years ago
Owncast 1c54874a12 Bundle embedded web app 2 years ago
renovate[bot] a4838f9b80 chore(deps): lock file maintenance 2 years ago
Owncast 4cad99f7cc Commit screenshots 2 years ago
Owncast 2824d29412 Bundle embedded web app 2 years ago
Gabe Kangas d43c2be44a
fix(admin): display year for user tables if not current year. Closes #3175 2 years ago
Owncast 0c3f317f13 Bundle embedded web app 2 years ago
Gabe Kangas 4790880c19
fix(admin): save appearanceVariables to admin global config state. Fixes #3170 2 years ago
Owncast 2d420b98e8 Bundle embedded web app 2 years ago
Gabe Kangas 670eae10db
fix(admin): maybe help with firefox+service workers? Re: #3097 2 years ago
Owncast ca2bc96348 Bundle embedded web app 2 years ago
renovate[bot] b9331301c7
chore(deps): update dependency @types/react to v18.2.15 2 years ago
Owncast bc96f198c4 Bundle embedded web app 2 years ago
renovate[bot] 3f065e139b
chore(deps): update dependency knip to v2.15.5 2 years ago
Owncast efa166fcb0 Commit screenshots 2 years ago
Owncast 9e6614152c Bundle embedded web app 2 years ago
renovate[bot] 20079c026f
chore(deps): update dependency knip to v2.15.4 2 years ago
Owncast 6395a80d3c Bundle embedded web app 2 years ago
renovate[bot] bae81324dd
chore(deps): update dependency @babel/core to v7.22.9 2 years ago
Owncast ba1eb175a7 Bundle embedded web app 2 years ago
janWilejan 585d6e1f04
Bump next to 13.4.10 (#3177) 2 years ago
Owncast d8a924ce44 Bundle embedded web app 2 years ago
renovate[bot] 7a5b4e223d
fix(deps): update dependency xstate to v4.38.1 2 years ago
Owncast 5c15cd5c91 Bundle embedded web app 2 years ago
renovate[bot] df061de2cb
fix(deps): update dependency react-virtuoso to v4.4.0 2 years ago
Owncast 1feb394787 Commit screenshots 2 years ago
Owncast b97a3924da Bundle embedded web app 2 years ago
renovate[bot] 8a4aec8b32
chore(deps): update dependency knip to v2.15.2 2 years ago
Owncast 458d16fc73 Bundle embedded web app 2 years ago
janWilejan 8148f74736
Unhide dropdown in Viewer Info page (#3173) 2 years ago
Owncast 7bd037ed46 Bundle embedded web app 2 years ago
renovate[bot] 0f7bb5384b
fix(deps): update dependency sharp to v0.32.2 2 years ago
Owncast 6f3b2c871b Bundle embedded web app 2 years ago
renovate[bot] 87532a540a
chore(deps): update typescript-eslint monorepo to v5.62.0 2 years ago
Owncast 045a34f8b2 Commit screenshots 2 years ago
Owncast 2c1bc0094e Bundle embedded web app 2 years ago
renovate[bot] 4d430478f6
chore(deps): update dependency knip to v2.15.1 2 years ago
Owncast a614e275cf Bundle embedded web app 2 years ago
renovate[bot] cc324374cd
chore(deps): update dependency cypress to v12.17.1 2 years ago
Owncast 012230c2dc Bundle embedded web app 2 years ago
renovate[bot] 2614eaab64
chore(deps): update dependency @types/jest to v29.5.3 2 years ago
Owncast c4405c048e Bundle embedded web app 2 years ago
janWilejan e15e2dc47c
Fix deprecated antd dropdown warnings (#3171) 2 years ago
Owncast 5389554028 Bundle embedded web app 2 years ago
janWilejan 14baef4e36
remove excess resize event listeners (#3169) 2 years ago
Owncast 34b531b214 Commit screenshots 2 years ago
renovate[bot] 89dfa3bb66
chore(deps): update peter-evans/create-or-update-comment digest to d1355c8 2 years ago
Owncast 1eaf4e5f54 Bundle embedded web app 2 years ago
renovate[bot] abbb4f05c0
fix(deps): update dependency @fontsource/poppins to v5.0.5 2 years ago
Owncast a8aa37478d Commit screenshots 2 years ago
Owncast 47368731d6 Bundle embedded web app 2 years ago
janWilejan f889113526
change overflow behaviour in chat input (#3167) 2 years ago
Owncast db449bb685 Bundle embedded web app 2 years ago
janWilejan 101174f71e
replace margins with padding in the chat container (#3165) 2 years ago
Owncast f6182229f5 Bundle embedded web app 2 years ago
John Regan 3f65099910
Name change: better unicode handling (#3164) 2 years ago
John Regan dfa3a2a273
chat: check that a new username is different before sending out updates (#3162) 2 years ago
Owncast 822de27cfd Bundle embedded web app 2 years ago
John Regan 056bd9f152
contenteditable: remove warning about unknown property onContentChange (#3161) 2 years ago
janWilejan 3f4887020d
Add resize handle to chat (#3157) 2 years ago
Owncast c92f58df2e Commit screenshots 2 years ago
dependabot[bot] faaf4583ed
Bump semver from 5.7.1 to 5.7.2 in /test/automated/api (#3163) 2 years ago
Owncast 63b3867203 Bundle embedded web app 2 years ago
John Regan a663f8ec34
replace grapheme-splitter with graphemer (updated fork) (#3160) 2 years ago
Owncast 22683dab46 Bundle embedded web app 2 years ago
renovate[bot] 52ffc266f8
chore(deps): update dependency babel-loader to v9.1.3 2 years ago
Owncast 05188d4339 Bundle embedded web app 2 years ago
renovate[bot] e047c3bd18 chore(deps): lock file maintenance 2 years ago
renovate[bot] 6d9fcdd451
chore(deps): update peter-evans/create-or-update-comment digest to 540f247 2 years ago
Owncast 5ef717b5db Commit screenshots 2 years ago
Owncast 2b3990ea9c Bundle embedded web app 2 years ago
renovate[bot] 00ebacb3d0
fix(deps): update nextjs monorepo to v13.4.9 (#3148) 2 years ago
Owncast 92e867d1ae Bundle embedded web app 2 years ago
Dev Gupta d107a3386c
Update ActionButtonRow.module.scss (#3156) 2 years ago
Owncast c3e988f1a1 Bundle embedded web app 2 years ago
janWilejan 2d72935564
change chat from a sidebar to a column (#3113) 2 years ago
dependabot[bot] 60d6cda3a6
Bump tough-cookie and artillery in /test/load (#3154) 2 years ago
Owncast 8915322d51 Bundle embedded web app 2 years ago
John Regan c132d82645
simpler chatbox (#3146) 2 years ago
Owncast aeed7a678d Bundle embedded web app 2 years ago
dependabot[bot] e38a4a1576
Bump tough-cookie from 4.0.0 to 4.1.3 in /test/automated/api (#3152) 2 years ago
renovate[bot] b0ebf9e9d0
chore(deps): update dependency stylelint-config-standard to v34 (#3144) 2 years ago
dependabot[bot] 0d3ffc6ec1
Bump tough-cookie from 4.0.0 to 4.1.3 in /test/automated/hls (#3153) 2 years ago
Owncast a0aa84ebfc Bundle embedded web app 2 years ago
janWilejan d09031faeb
Increase width of volume slider to 100px (#3155) 2 years ago
Gabe Kangas 40de64fffe
chore: add support for exporting our colors as Swift files 2 years ago
Owncast 29499d5b11 Bundle embedded web app 2 years ago
renovate[bot] a64d7fb7d6
chore(deps): update dependency cypress to v12.17.0 2 years ago
Owncast 37cdf525f5 Bundle embedded web app 2 years ago
renovate[bot] 9a62ddf2fa
chore(deps): update dependency @babel/core to v7.22.8 2 years ago
Owncast 873f2f37db Commit screenshots 2 years ago
Owncast ac4d07a3ed Bundle embedded web app 2 years ago
renovate[bot] 91b6d4581c
chore(deps): update dependency npm to v9.8.0 2 years ago
Owncast f248defcaf Commit screenshots 2 years ago
Owncast db03d730ce Bundle embedded web app 2 years ago
dependabot[bot] 0f9a5e9a1e
Bump stylelint from 15.10.0 to 15.10.1 in /web (#3151) 2 years ago
Owncast d18d9e3ced Bundle embedded web app 2 years ago
renovate[bot] 9babe96887
fix(deps): update dependency react-hotkeys-hook to v4.4.1 2 years ago
Owncast 577d7246f5 Bundle embedded web app 2 years ago
renovate[bot] 6d8de93456
chore(deps): update dependency @babel/core to v7.22.6 2 years ago
Owncast 867decab0e Commit screenshots 2 years ago
Owncast a216bfba74 Bundle embedded web app 2 years ago
renovate[bot] b2788e76bc
fix(deps): update dependency @fontsource/poppins to v5.0.4 2 years ago
Owncast 24d0356f80 Bundle embedded web app 2 years ago
renovate[bot] a05df21084
chore(deps): update typescript-eslint monorepo to v5.61.0 2 years ago
Owncast 651edd70af Bundle embedded web app 2 years ago
John Regan 58bc3ac173
emoji: display native emoji simiarly to custom (#3147) 2 years ago
renovate[bot] cc75be1c00
fix(deps): update module golang.org/x/net to v0.12.0 2 years ago
renovate[bot] 08a97d0cf0
fix(deps): update module github.com/aws/aws-sdk-go to v1.44.296 (#3145) 2 years ago
renovate[bot] e20f467fbb
fix(deps): update module golang.org/x/mod to v0.12.0 2 years ago
Owncast 256b988772 Bundle embedded web app 2 years ago
janWilejan 185123dab2
fail silently when no codces are found (#3142) 2 years ago
Owncast f2d9d407c3 Commit screenshots 2 years ago
Owncast 2a328a04e6 Bundle embedded web app 2 years ago
Gabe Kangas 9288837f9d
fix(admin): fix custom emoji imgs being rendered with odd size. Fixes #3126 2 years ago
Owncast 83d07b0160 Bundle embedded web app 2 years ago
John Regan 46ca5223f9
Chat wire protocol (#3125) 2 years ago
Owncast e9a4899686 Bundle embedded web app 2 years ago
Gabe Kangas dc2c46e2a4
fix(ui): fix for exception when chat is disabled. Closes #3138 2 years ago
Owncast d08b518684 Bundle embedded web app 2 years ago
janWilejan 74ad8d5e18
Fix chat flicker / Usernames collapse in order (#3135) 2 years ago
Owncast 9b450ec64b Bundle embedded web app 2 years ago
John Regan 5c07e3ced6
highlighting: make case-insensitive, support unicode (#3137) 2 years ago
renovate[bot] 80ffd28551
chore(deps): update peter-evans/create-or-update-comment digest to 13f4e02 2 years ago
Owncast 1c7a7b88b5 Commit screenshots 2 years ago
Owncast e3680a2fb3 Bundle embedded web app 2 years ago
Gabe Kangas 65d52072d4
fix(chat): reposition chat loading spinner 2 years ago
Owncast ea294294bd Bundle embedded web app 2 years ago
Gabe Kangas 00a5fb8dc8
fix: pass username and instance url to external actions. Fixes #3130 2 years ago
Gabe Kangas 5876c7cfbb
fix(ui): simplify modal loading ui state 2 years ago
Owncast 4db77f5811 Bundle embedded web app 2 years ago
renovate[bot] 372a025ed0
chore(deps): update dependency eslint to v8.44.0 2 years ago
renovate[bot] 68ebf0a4aa
fix(deps): update module github.com/shirou/gopsutil/v3 to v3.23.6 2 years ago
renovate[bot] cadc2e3f48
fix(deps): update module github.com/aws/aws-sdk-go to v1.44.295 2 years ago
Owncast 294a79a665 Commit screenshots 2 years ago
Owncast f201ac8d51 Bundle embedded web app 2 years ago
renovate[bot] e170123d0c
chore(deps): update dependency @types/node to v18.16.19 2 years ago
Owncast 70b3d2f544 Bundle embedded web app 2 years ago
renovate[bot] bd8f4452dc
chore(deps): update dependency stylelint-config-standard-scss to v10 (#3128) 2 years ago
Owncast b98ad0389e Bundle embedded web app 2 years ago
renovate[bot] 13173f532e
fix(deps): update dependency antd to v4.24.12 2 years ago
Owncast f29ac903fa Bundle embedded web app 2 years ago
renovate[bot] 7b2b4a525d
chore(deps): update dependency ts-jest to v29.1.1 2 years ago
Owncast e15bbb5883 Bundle embedded web app 2 years ago
renovate[bot] 4347bd8963
chore(deps): update dependency mermaid to v10.2.4 2 years ago
Owncast 7abac469d5 Commit screenshots 2 years ago
Owncast e23ff64362 Commit screenshots 2 years ago
Owncast 0a50b02bd2 Commit screenshots 2 years ago
Owncast b352eaebb4 Bundle embedded web app 2 years ago
John Regan bf1ccf21d2
chat: simplify input handling (#3124) 2 years ago
Owncast 8ad81544f1 Bundle embedded web app 2 years ago
renovate[bot] 4bec812a9f
chore(deps): update dependency cypress to v12.16.0 2 years ago
Owncast 99aabc64b0 Bundle embedded web app 2 years ago
renovate[bot] bd6c44396b
fix(deps): update dependency antd to v4.24.11 2 years ago
Owncast d3ad99adb0 Bundle embedded web app 2 years ago
renovate[bot] 1c381fc4bf
fix(deps): update dependency @uiw/react-codemirror to v4.21.7 2 years ago
Owncast 23b431c3d0 Commit screenshots 2 years ago
Owncast c8d625288c Bundle embedded web app 2 years ago
Gabe Kangas bcd08633b4
fix(chat): simplify emoji + char count handling. Closes #3120 2 years ago
Owncast 5436f3001e Bundle embedded web app 2 years ago
Gabe Kangas f1bde962cc
feat(admin): auto-expand news item if there is only one 2 years ago
Owncast 03c06ba0b8 Bundle embedded web app 2 years ago
renovate[bot] 127853dcdf
fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.21.7 2 years ago
Owncast 53eeb97c19 Bundle embedded web app 2 years ago
renovate[bot] 2b2a8298ec
chore(deps): update typescript-eslint monorepo to v5.60.1 2 years ago
Owncast 57787e59ba Bundle embedded web app 2 years ago
renovate[bot] 6c60424c77
chore(deps): update dependency knip to v2.14.3 2 years ago
Owncast 70ce915102 Bundle embedded web app 2 years ago
renovate[bot] 4266583d67
fix(deps): update dependency xstate to v4.38.0 2 years ago
Owncast bfb3cf2bf2 Commit screenshots 2 years ago
Owncast 4cdf436439 Bundle embedded web app 2 years ago
renovate[bot] 88b453c168
fix(deps): update dependency @uiw/react-codemirror to v4.21.5 2 years ago
renovate[bot] dd269b8bc0
chore(deps): update peter-evans/create-or-update-comment digest to be902ae 2 years ago
Owncast fd172fe4e9 Bundle embedded web app 2 years ago
Dev Gupta d973d1ac38
Update Sidebar.tsx (#3119) 2 years ago
Owncast 30f5cbcbc4 Bundle embedded web app 2 years ago
Gabe Kangas b1a8f712c0
fix(embed): leave room for status bar in video embed. Closes #3104 2 years ago
Owncast e4b5ebc48b Bundle embedded web app 2 years ago
janWilejan ce724fa073
username of repeat chat messages is display:none (#3101) 2 years ago
Owncast a582ba1eb2 Bundle embedded web app 2 years ago
Gabe Kangas 6805a7c1db
feat(ui): more improvements to initial loading state 2 years ago
Owncast b4cab0ec7f Bundle embedded web app 2 years ago
renovate[bot] 739ddd6487
fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.21.5 2 years ago
Owncast 46a66c2a62 Bundle embedded web app 2 years ago
Gabe Kangas d60289c8bc
feat(ui): improve loading state 2 years ago
Owncast ac8f9b3945 Commit screenshots 2 years ago
Owncast 4d26d2bcd6 Bundle embedded web app 2 years ago
Gabe Kangas 0fd18cf889
fix: split out styles into two style tags. Should help #2989 2 years ago
Owncast f0644f4cbe Bundle embedded web app 2 years ago
Gabe Kangas e7f464a10f
fix(ui): fix not being able to disable browser notifications. Closes #3115 2 years ago
Gabe Kangas 78353fa6af
fix(test): modal auto-closes now 2 years ago
Owncast c36cb12719 Bundle embedded web app 2 years ago
Gabe Kangas 1ea9a548e1
fix(ui): fallback to an empty array. Closes #3116 2 years ago
Owncast f4b5d6cdb8 Bundle embedded web app 2 years ago
Gabe Kangas 1f755cb0ba
fix(chat): do not allow chat scrolling to impact page scrolling. Closes #3109 2 years ago
Gabe Kangas 1d6877d3ef
fix(admin): fix error displaying and do not allow deleting of the last stream key. Closes #3114 2 years ago
Owncast ffcc40d471 Bundle embedded web app 2 years ago
Gabe Kangas 02811ef37e
feat(chat): preload and cache the custom emoji. Closes #3117 2 years ago
Gabe Kangas 8a4039217f
fix(test): fix test to reflect chat message updates 2 years ago
Gabe Kangas f9d0d66271
feat(chat): cache custom emoji. For #3117 2 years ago
Owncast 9c3006677e Bundle embedded web app 2 years ago
Gabe Kangas a354787a9e
feat(chat): support line breaks and pasted content. Closes #3108 2 years ago
Owncast bd6e263eb9 Bundle embedded web app 2 years ago
renovate[bot] 35023f20df
chore(deps): update dependency stylelint to v15.9.0 2 years ago
Owncast c35714b5c1 Bundle embedded web app 2 years ago
renovate[bot] cfcd7d2a65
chore(deps): update dependency knip to v2.14.2 2 years ago
Owncast 4cec3a61e1 Bundle embedded web app 2 years ago
renovate[bot] fb2379c1be
fix(deps): update dependency react-virtuoso to v4.3.11 2 years ago
Owncast 07dbc9dfea Bundle embedded web app 2 years ago
renovate[bot] 72e9404717
fix(deps): update dependency picmo to v5.8.5 2 years ago
Owncast d29164ce78 Bundle embedded web app 2 years ago
renovate[bot] ff7642a50f
fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.21.4 2 years ago
Owncast ab47015397 Commit screenshots 2 years ago
Owncast acde0f6143 Bundle embedded web app 2 years ago
renovate[bot] 2766aace44
fix(deps): update dependency @uiw/react-codemirror to v4.21.4 2 years ago
Owncast f2c896c93a Bundle embedded web app 2 years ago
renovate[bot] 4ae071b3ab
chore(deps): update dependency @types/react to v18.2.14 2 years ago
Owncast 566dedfb7e Bundle embedded web app 2 years ago
Gabe Kangas d33f117a82
fix(chat): fix missing alt tags on custom emoji. Closes #3106 2 years ago
Owncast b696efb0eb Bundle embedded web app 2 years ago
renovate[bot] b7c5e75f19
fix(deps): update codemirror 2 years ago
Owncast 2060c4f2a7 Bundle embedded web app 2 years ago
janWilejan 7930747cbb
Fix highlight in video quality selection menu (#3102) 2 years ago
Owncast 2b7042ff98 Bundle embedded web app 2 years ago
janWilejan c563742856
Chat popup (#3098) 2 years ago
Owncast fca85a4a42 Commit screenshots 2 years ago
Owncast 5fa97464ae Bundle embedded web app 2 years ago
renovate[bot] 9903174ad1
chore(deps): update dependency chromatic to v6.19.9 2 years ago
Owncast 8da2f07629 Bundle embedded web app 2 years ago
renovate[bot] 23bf5c3bc5
fix(deps): update nextjs monorepo to v13.4.7 2 years ago
Owncast 17f1967eff Commit screenshots 2 years ago
Owncast 586ff69066 Bundle embedded web app 2 years ago
renovate[bot] 585aff1889
chore(deps): update dependency sass to v1.63.6 2 years ago
Owncast 83163e143c Bundle embedded web app 2 years ago
renovate[bot] f36841194b
chore(deps): update dependency npm to v9.7.2 2 years ago
Owncast a2971ae958 Bundle embedded web app 2 years ago
renovate[bot] 51a6a7c95a
chore(deps): update dependency sass to v1.63.5 2 years ago
Owncast f6c855312d Commit screenshots 2 years ago
Owncast a6e95cc9e8 Bundle embedded web app 2 years ago
janWilejan e752934fd5
fix TitleNotifier crash (#3100) 2 years ago
Owncast 990b720611 Bundle embedded web app 2 years ago
renovate[bot] 0ad9b6c9cd
chore(deps): update dependency @storybook/testing-library to v0.2.0 2 years ago
Owncast d6f7be262d Bundle embedded web app 2 years ago
renovate[bot] d5bb88c2cc
chore(deps): update dependency cypress to v12.15.0 2 years ago
Owncast 093b9dc087 Commit screenshots 2 years ago
Owncast cbda5898ea Bundle embedded web app 2 years ago
renovate[bot] 068afa1b61
chore(deps): update typescript-eslint monorepo to v5.60.0 2 years ago
Owncast 121a9d401a Bundle embedded web app 2 years ago
Gabe Kangas 06adee2bc2
fix(chat): restore placeholder value to what it was before 2 years ago
Gabe Kangas 096834020e
chore: remove vscode config file 2 years ago
Owncast 67acf8c51c Bundle embedded web app 2 years ago
renovate[bot] 7c92482e7c
chore(deps): update dependency @types/react to v18.2.13 2 years ago
Owncast 974e4d8879 Commit screenshots 2 years ago
renovate[bot] 0ab883ae09
fix(deps): update module golang.org/x/net to v0.11.0 2 years ago
Owncast c1ecf4c31c Bundle embedded web app 2 years ago
Gabe Kangas 742131695c
fix(tests): ignore stylint packages 2 years ago
Owncast 0971bda3bf Bundle embedded web app 2 years ago
Gabe Kangas 7924a561b2
fix(chat): update scroll to bottom button text color 2 years ago
renovate[bot] c27553f758
fix(deps): update module golang.org/x/mod to v0.11.0 2 years ago
renovate[bot] bc9327e679
fix(deps): update module github.com/prometheus/client_golang to v1.16.0 2 years ago
renovate[bot] a68cd77135
fix(deps): update module github.com/oschwald/geoip2-golang to v1.9.0 2 years ago
renovate[bot] f50dca6ed0
chore(deps): update peter-evans/create-or-update-comment digest to c470f6f 2 years ago
Owncast 3eacb5e8d3 Commit screenshots 2 years ago
Owncast bae1f84390 Bundle embedded web app 2 years ago
Gabe Kangas ccb9b5d075
chore: run stylelint on our css files 2 years ago
Owncast 8c968ff676 Bundle embedded web app 2 years ago
Gabe Kangas 9a4b19068f
chore(tests): add stylelint config 2 years ago
Gabe Kangas 0e13bd143e
fix(chat): set cursor for chat input field 2 years ago
Owncast df2d75e690 Bundle embedded web app 2 years ago
Gabe Kangas fb5cb10aa2
fix(ui): set description value to action button title 2 years ago
Owncast 7adfb6c211 Bundle embedded web app 2 years ago
Gabe Kangas ad814a8802
fix(chat): refactor chat input to not use slatejs. Closes #3094 2 years ago
renovate[bot] 683f73c379
fix(deps): update module github.com/aws/aws-sdk-go to v1.44.286 2 years ago
renovate[bot] 4806af0025
fix(deps): update module github.com/shirou/gopsutil/v3 to v3.23.5 2 years ago
Owncast e504a1997b Bundle embedded web app 2 years ago
renovate[bot] 02347593a8
fix(deps): update dependency slate-react to v0.97.0 2 years ago
Owncast 04cfc6ea4f Commit screenshots 2 years ago
Owncast 698b14ecc9 Bundle embedded web app 2 years ago
Gabe Kangas 8862d5d6ef
Remove unused default exports 2 years ago
Owncast 61903f7429 Bundle embedded web app 2 years ago
renovate[bot] 7b68af1765
chore(deps): lock file maintenance (#3095) 2 years ago
Owncast 0f90dd7887 Bundle embedded web app 2 years ago
renovate[bot] 3950dfa1f5
chore(deps): update dependency eslint to v8.43.0 2 years ago
Owncast 67561c3711 Bundle embedded web app 2 years ago
renovate[bot] 3d4743d9b9
chore(deps): update dependency chromatic to v6.19.8 2 years ago
Owncast 3a7915566a Commit screenshots 2 years ago
Owncast 291d2b9f40 Bundle embedded web app 2 years ago
renovate[bot] 6f2a4b0c2b
fix(deps): update nextjs monorepo to v13.4.6 2 years ago
Owncast bb0324d303 Commit screenshots 2 years ago
Owncast b7bf758e74 Bundle embedded web app 2 years ago
renovate[bot] 9b247f734a
chore(deps): update dependency chromatic to v6.19.7 2 years ago
Owncast 49e9835ed7 Bundle embedded web app 2 years ago
renovate[bot] 252ce67ccc
chore(deps): update dependency sass to v1.63.4 2 years ago
Owncast d1e8f5e9d6 Commit screenshots 2 years ago
Owncast dcb1b2287e Bundle embedded web app 2 years ago
renovate[bot] aae801060f
fix(deps): update dependency slate-react to v0.96.0 2 years ago
Owncast d22c8966f5 Bundle embedded web app 2 years ago
renovate[bot] 0ee674f127
chore(deps): update dependency chromatic to v6.19.5 2 years ago
Owncast 72e40ec7f2 Bundle embedded web app 2 years ago
renovate[bot] ab8b84574d
chore(deps): update dependency @types/node to v18.16.18 2 years ago
Owncast e8acab63db Commit screenshots 2 years ago
Owncast cf3ba179db Bundle embedded web app 2 years ago
renovate[bot] 58126d5912
chore(deps): update typescript-eslint monorepo to v5.59.11 2 years ago
Owncast 50647433de Bundle embedded web app 2 years ago
renovate[bot] 0a845dbc9c
chore(deps): update dependency @types/react to v18.2.12 2 years ago
Owncast 15f54d4070 Bundle embedded web app 2 years ago
renovate[bot] e5c1938e34
fix(deps): update dependency @uiw/react-codemirror to v4.21.3 2 years ago
Owncast db23565b95 Bundle embedded web app 2 years ago
renovate[bot] 3a347c1b03
fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.21.3 2 years ago
Owncast ca40021f5b Bundle embedded web app 2 years ago
Gabe Kangas a86049729e
fix(chat): enable tld validation in autolinking and add online to accepted tlds 2 years ago
Owncast 809196527d Bundle embedded web app 2 years ago
renovate[bot] f7cd508922
chore(deps): update dependency npm to v9.7.1 2 years ago
Owncast db8485e505 Bundle embedded web app 2 years ago
renovate[bot] 1c6f768312
chore(deps): update dependency cypress to v12.14.0 2 years ago
Owncast 8a7b06d2d4 Bundle embedded web app 2 years ago
renovate[bot] 41c7b77f8c
fix(deps): update nextjs monorepo to v13.4.5 2 years ago
Owncast cd10822b5e Bundle embedded web app 2 years ago
renovate[bot] 09b56f9998
fix(deps): update fontsource monorepo to v5.0.3 2 years ago
renovate[bot] 50de7c8d28
chore(deps): update alpine docker tag to v3.18.2 2 years ago
Owncast 7b288b59ed Bundle embedded web app 2 years ago
Gabe Kangas 8a3bae4c30
fix(mobile): bottom section not filling width. Closes #3073 2 years ago
Owncast ae8d09c221 Bundle embedded web app 2 years ago
renovate[bot] 83159aea54
fix(deps): update dependency react-virtuoso to v4.3.10 2 years ago
Owncast 2ad8d1be9f Bundle embedded web app 2 years ago
renovate[bot] 015bd75a4a
fix(deps): update dependency react-error-boundary to v4.0.10 2 years ago
renovate[bot] ed0e44f981
chore(deps): update peter-evans/create-or-update-comment digest to 411d7f9 2 years ago
Owncast dd87521eea Bundle embedded web app 2 years ago
renovate[bot] 4739a5f57d
chore(deps): update dependency mermaid to v10.2.3 2 years ago
Owncast eccaa2600e Bundle embedded web app 2 years ago
renovate[bot] a4e443ee3d
chore(deps): update dependency html-webpack-plugin to v5.5.3 2 years ago
Owncast a657f9b05b Bundle embedded web app 2 years ago
Yusuke 7fc5857d4c
Fix path for image open meta tag #3075. (#3087) 2 years ago
Owncast 42c84f29a3 Bundle embedded web app 2 years ago
renovate[bot] dd83fb984f
chore(deps): update dependency @types/react to v18.2.11 2 years ago
Gabe Kangas fd1f3a1952
chore(tests): add additional test caching 2 years ago
Gabe Kangas 9b44ff107f
fix(api): validate stream key payload. Closes #3082 2 years ago
Owncast 26686dd6da Bundle embedded web app 2 years ago
renovate[bot] bbd13be90a
chore(deps): update dependency sass-loader to v13.3.2 2 years ago
Owncast ee21b52b28 Bundle embedded web app 2 years ago
renovate[bot] 68936e7772
chore(deps): update dependency @types/react to v18.2.10 2 years ago
Owncast 7ba6db3b9d Bundle embedded web app 2 years ago
renovate[bot] 9e65c04e54
chore(deps): update dependency @types/node to v18.16.17 2 years ago
Owncast 9d646a1d4f Bundle embedded web app 2 years ago
Mohib Khan 6fa576a04a
feat: close modal after name change (#3084) 2 years ago
Owncast f616f02be3 Commit screenshots 2 years ago
Owncast 1e89bdba29 Bundle embedded web app 2 years ago
Gabe Kangas 58f2d09815
fix(chat): try to improve auto scroll to bottom. Closes #3029 2 years ago
Owncast 6e46034414 Bundle embedded web app 2 years ago
renovate[bot] 03e8b172c4
chore(deps): update dependency sass to v1.63.3 2 years ago
Owncast 0dd84a50bf Bundle embedded web app 2 years ago
renovate[bot] 41bbbb2653
chore(deps): update dependency html-webpack-plugin to v5.5.2 2 years ago
Owncast 229b8551e1 Bundle embedded web app 2 years ago
renovate[bot] 3e4efe69b6
chore(deps): update dependency less-loader to v11.1.3 2 years ago
Owncast 5021ff8335 Bundle embedded web app 2 years ago
renovate[bot] 944a1e8888
chore(deps): update dependency @babel/core to v7.22.5 2 years ago
Owncast 8ccbb59a36 Bundle embedded web app 2 years ago
renovate[bot] 5861169a6b
fix(deps): update dependency react-virtuoso to v4.3.9 2 years ago
Owncast 14ce9c2244 Bundle embedded web app 2 years ago
renovate[bot] 669be1154c
chore(deps): update dependency chromatic to v6.18.2 2 years ago
Owncast 76a8d16696 Bundle embedded web app 2 years ago
renovate[bot] 9b3b7183d5
chore(deps): update dependency sass to v1.63.2 2 years ago
Owncast 43e38386ce Bundle embedded web app 2 years ago
renovate[bot] 788e1c9c62
chore(deps): update dependency @types/react to v18.2.9 2 years ago
Owncast 9beafba01f Bundle embedded web app 2 years ago
renovate[bot] 117d4dfec7
fix(deps): update dependency @uiw/react-codemirror to v4.21.2 2 years ago
Owncast a03692bb94 Bundle embedded web app 2 years ago
renovate[bot] 8b6c47fb86
fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.21.2 2 years ago
Owncast b64196aaaa Bundle embedded web app 2 years ago
renovate[bot] f422500b46 fix(deps): update dependency @uiw/react-codemirror to v4.21.1 2 years ago
  1. 23
      .github/PULL_REQUEST_TEMPLATE/atomic-refactor-pull-request-for-issue-2119.md
  2. 4
      .github/PULL_REQUEST_TEMPLATE/standard-pull-request.md
  3. 1
      .github/codeql/go.yml
  4. 4
      .github/codeql/javascript.yml
  5. 2
      .github/workflows/actions-lint.yml
  6. 2
      .github/workflows/auto-comment-on-label.yaml
  7. 4
      .github/workflows/automated-end-to-end-api.yaml
  8. 10
      .github/workflows/browser-testing.yml
  9. 2
      .github/workflows/build-storybook.yml
  10. 44
      .github/workflows/bundle-web.yml
  11. 2
      .github/workflows/chromatic.yml
  12. 9
      .github/workflows/codeql-analysis.yml
  13. 2
      .github/workflows/container-lint.yml
  14. 4
      .github/workflows/container.yaml
  15. 2
      .github/workflows/generate-api-documentation.yaml
  16. 8
      .github/workflows/go-lint.yml
  17. 28
      .github/workflows/go-tests.yaml
  18. 6
      .github/workflows/hls-tests.yml
  19. 185
      .github/workflows/javascript-format-build.yml
  20. 96
      .github/workflows/javascript-formatting.yml
  21. 4
      .github/workflows/javascript-tests.yml
  22. 6
      .github/workflows/screenshots.yml
  23. 4
      .github/workflows/shellcheck.yml
  24. 50
      .github/workflows/test-webapp-build.yaml
  25. 1
      .gitignore
  26. 4
      .golangci.yml
  27. 2
      Dockerfile
  28. 24
      Earthfile
  29. 6
      README.md
  30. 8
      activitypub/inbox/like.go
  31. 10
      activitypub/inbox/workerpool.go
  32. 2
      activitypub/outbox/outbox.go
  33. 8
      activitypub/webfinger/webfinger.go
  34. 9
      activitypub/workerpool/outbound.go
  35. 18
      auth/indieauth/client.go
  36. 2
      auth/indieauth/server.go
  37. 6
      auth/persistence.go
  38. 18
      build/web/bundleWeb.sh
  39. 2
      config/constants.go
  40. 4
      config/verifyInstall.go
  41. 2
      contrib/owncast_for_windows.md
  42. 12
      controllers/admin/chat.go
  43. 21
      controllers/admin/config.go
  44. 2
      controllers/admin/serverConfig.go
  45. 1
      controllers/chat.go
  46. 14
      controllers/config.go
  47. 3
      controllers/emoji.go
  48. 98
      controllers/index.go
  49. 4
      core/chat/chatclient.go
  50. 19
      core/chat/events.go
  51. 4
      core/chat/events/connectedClientInfo.go
  52. 139
      core/chat/events/events.go
  53. 4
      core/chat/events/eventtype.go
  54. 17
      core/chat/events/userPartEvent.go
  55. 25
      core/chat/messageRendering_test.go
  56. 3
      core/chat/persistence.go
  57. 80
      core/chat/server.go
  58. 3
      core/core.go
  59. 111
      core/data/config.go
  60. 2
      core/data/configEntry.go
  61. 6
      core/data/data_test.go
  62. 84
      core/data/emoji.go
  63. 10
      core/data/types.go
  64. 6
      core/rtmp/rtmp.go
  65. 16
      core/storageproviders/local.go
  66. 13
      core/storageproviders/rewriteLocalPlaylist.go
  67. 66
      core/storageproviders/s3Storage.go
  68. 3
      core/streamState.go
  69. 8
      core/transcoder/thumbnailGenerator.go
  70. 10
      core/transcoder/utils.go
  71. 311
      core/user/externalAPIUser.go
  72. 25
      core/user/externalAPIUser_test.go
  73. 473
      core/user/user.go
  74. 10
      core/webhooks/chat.go
  75. 15
      core/webhooks/webhooks.go
  76. 7
      core/webhooks/webhooks_test.go
  77. 13
      core/webhooks/workerpool.go
  78. 2
      db/query.sql
  79. 4
      db/query.sql.go
  80. 14
      docs/api/index.html
  81. 2
      geoip/geoip.go
  82. 60
      go.mod
  83. 156
      go.sum
  84. 2
      logging/logging.go
  85. 6
      metrics/metrics.go
  86. 19
      models/externalAPIUser.go
  87. 19
      models/s3Storage.go
  88. 36
      models/user.go
  89. 10
      openapi.yaml
  90. 23
      router/middleware/auth.go
  91. 83
      static/metadata.html.tmpl
  92. 11
      static/static.go
  93. 6
      static/web/404.html
  94. 6
      static/web/404/index.html
  95. 1
      static/web/_next/static/7FO45oyNxons-CT00qbSN/_buildManifest.js
  96. 0
      static/web/_next/static/7FO45oyNxons-CT00qbSN/_ssgManifest.js
  97. 1
      static/web/_next/static/_EwXAWpD9Ghec1YlZX6x3/_buildManifest.js
  98. 1
      static/web/_next/static/chunks/1008.34cc20ecda8c2f89.js
  99. 1
      static/web/_next/static/chunks/1008.65d0bc27255efb44.js
  100. 1
      static/web/_next/static/chunks/1010.398d7f6d64350bec.js
  101. Some files were not shown because too many files have changed in this diff Show More

23
.github/PULL_REQUEST_TEMPLATE/atomic-refactor-pull-request-for-issue-2119.md

@ -1,23 +0,0 @@ @@ -1,23 +0,0 @@
<!-- this template is for changes relating to #2119. You might want to use the standard template. -->
# Description
<!-- do not remove -->
This PR is for updating/adding a component following the atomic design pattern set out in #2119.
<!-- mention the component you changed, and describe any design choices if necessary -->
---
Extra Info
<!-- fill these in -->
- Component name in [kanban board](https://collab.owncast.tv/kanban/#/2/kanban/edit/omLI2N+LcnP+elmdT7qW9GHD/): `________`
Checklist:
- [] The component follows the [design guide](../../web/components/_COMPONENT_HOW_TO.md).
- [] Moved the component to the correct `atoms` / `molecules` / `organisms` / `templates` directory.
- [] Added an explanation to this PR for any major changes you made.
- [] Replaced any [`defaultProps`](https://www.reactjstutorials.com/react-basics/17/react-default-props) with default args.
- [] Added a (short) JSDoc description to the component.
- [] Removed the component's Storybook description text with if it's not needed.

4
.github/PULL_REQUEST_TEMPLATE/standard-pull-request.md

@ -1,6 +1,8 @@ @@ -1,6 +1,8 @@
Please include a summary of the change and which issue number is fixed, including relevant motivation and context. Feel free to mark this as a Draft or WIP and write up some details later.
If there is no issue filed for this particular change it's highly recommended you file one. While creating this PR means you probably already did the work, in the future make sure an issue is filed beforehand so changes, fixes and features can be discussed ahead of time.
# Description
Fixes # (issue)
@ -14,4 +16,4 @@ Some things you might want to mention: @@ -14,4 +16,4 @@ Some things you might want to mention:
3. If you're fixing something, what was wrong? How should we stop from having this issue happen again?
4. If this is a new feature or addition to functionality, why should it be added? What are the use cases? Who was asking for this functionality?
If this is an unsolicited change or have no issue associated please do your best to detail the motivations behind this PR.
If this is an unsolicited change or have no issue associated please do your best to detail the motivations behind this PR, and think about filing an issue to discuss changes ahead of time in the future.

1
.github/codeql/go.yml

@ -0,0 +1 @@ @@ -0,0 +1 @@
name: Go config

4
.github/codeql/javascript.yml

@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
name: Javascript config
paths-ignore:
- static/web

2
.github/workflows/actions-lint.yml

@ -13,7 +13,7 @@ jobs: @@ -13,7 +13,7 @@ jobs:
name: GitHub actions
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- uses: docker://rhysd/actionlint:latest
with:

2
.github/workflows/auto-comment-on-label.yaml

@ -11,7 +11,7 @@ jobs: @@ -11,7 +11,7 @@ jobs:
issues: write
steps:
- name: Add comment
uses: peter-evans/create-or-update-comment@c6c9a1a66007646a28c153e2a8580a5bad27bcfa
uses: peter-evans/create-or-update-comment@0f44b017d10caeea6a4c1b410ba0521ad8a02815
with:
issue-number: ${{ github.event.issue.number }}
body: |

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

@ -27,12 +27,12 @@ jobs: @@ -27,12 +27,12 @@ jobs:
- name: Set up QEMU
id: qemu
uses: docker/setup-qemu-action@v2
uses: docker/setup-qemu-action@v3
with:
image: tonistiigi/binfmt:latest
platforms: all
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Run API tests
uses: nick-fields/retry@v2

10
.github/workflows/browser-testing.yml

@ -20,9 +20,9 @@ jobs: @@ -20,9 +20,9 @@ jobs:
concurrent_skipping: 'same_content_newer'
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- uses: actions/setup-node@v3
- uses: actions/setup-node@v4
with:
node-version: 18.9.0
@ -38,13 +38,13 @@ jobs: @@ -38,13 +38,13 @@ jobs:
${{ runner.os }}-build-
${{ runner.os }}-
- uses: actions/setup-go@v4
- uses: actions/setup-go@v5
with:
go-version: '1.20'
go-version: '1.21'
cache: true
- name: Install Google Chrome
run: sudo apt-get install google-chrome-stable
run: sudo apt-get update && sudo apt-get install google-chrome-stable
- name: Run Browser tests
uses: nick-fields/retry@v2

2
.github/workflows/build-storybook.yml

@ -12,7 +12,7 @@ jobs: @@ -12,7 +12,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Cache node modules
uses: actions/cache@v3

44
.github/workflows/bundle-web.yml

@ -1,44 +0,0 @@ @@ -1,44 +0,0 @@
name: Build and bundle web app into Owncast
on:
push:
branches:
- develop
paths:
- 'web/**'
- '!**.md'
jobs:
bundle:
runs-on: ubuntu-latest
if: github.repository == 'owncast/owncast'
steps:
- id: skip_check
uses: fkirc/skip-duplicate-actions@v5
with:
concurrent_skipping: 'same_content_newer'
- name: Cache node modules
uses: actions/cache@v3
env:
cache-name: cache-node-modules-bundle-web-app
with:
path: ~/.npm
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('web/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: Bundle web app (next.js build)
uses: actions/checkout@v3
- run: build/web/bundleWeb.sh
- name: Commit changes
uses: EndBug/add-and-commit@v9
with:
pull: --rebase --autostash
message: 'Bundle embedded web app'
add: 'static/web'
author_name: Owncast
author_email: owncast@owncast.online

2
.github/workflows/chromatic.yml

@ -29,7 +29,7 @@ jobs: @@ -29,7 +29,7 @@ jobs:
concurrent_skipping: 'same_content_newer'
- name: Check out code
if: ${{ github.actor != 'renovate[bot]' && github.actor != 'renovate' }}
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
# Make sure the actual branch is checked out when running on pull requests
ref: ${{ github.event.pull_request.head.ref }}

9
.github/workflows/codeql-analysis.yml

@ -37,13 +37,14 @@ jobs: @@ -37,13 +37,14 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
config-file: ./.github/codeql/${{ matrix.language }}.yml
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
@ -52,7 +53,7 @@ jobs: @@ -52,7 +53,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v2
uses: github/codeql-action/autobuild@v3
# ℹ Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
@ -66,4 +67,4 @@ jobs: @@ -66,4 +67,4 @@ jobs:
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
uses: github/codeql-action/analyze@v3

2
.github/workflows/container-lint.yml

@ -19,7 +19,7 @@ jobs: @@ -19,7 +19,7 @@ jobs:
container:
image: aquasec/trivy
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Check critical issues
run: trivy config --exit-code 1 --severity "HIGH,CRITICAL" ./Dockerfile

4
.github/workflows/container.yaml

@ -32,13 +32,13 @@ jobs: @@ -32,13 +32,13 @@ jobs:
run: echo "${{ secrets.GH_CR_PAT }}" | docker login https://ghcr.io -u ${{ github.actor }} --password-stdin
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
uses: docker/setup-qemu-action@v3
with:
image: tonistiigi/binfmt:latest
platforms: all
- name: Checkout repo
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0

2
.github/workflows/generate-api-documentation.yaml

@ -10,7 +10,7 @@ jobs: @@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Run redoc on openapi.yaml
run: |

8
.github/workflows/go-lint.yml

@ -22,15 +22,15 @@ jobs: @@ -22,15 +22,15 @@ jobs:
with:
concurrent_skipping: 'same_content_newer'
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-go@v4
- uses: actions/setup-go@v5
with:
go-version: '1.20'
go-version: '1.21'
cache: true
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: golangci-lint
uses: golangci/golangci-lint-action@v3
with:

28
.github/workflows/go-tests.yaml

@ -12,14 +12,23 @@ jobs: @@ -12,14 +12,23 @@ jobs:
test:
strategy:
matrix:
go-version: [1.19.x, 1.20.x]
go-version: [1.20.x, 1.21.x]
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- uses: actions/cache@v3
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: go-test-${{ github.sha }}
restore-keys: |
go-test-
- name: Install go
uses: actions/setup-go@v4
uses: actions/setup-go@v5
with:
go-version: '^1'
cache: true
@ -38,10 +47,19 @@ jobs: @@ -38,10 +47,19 @@ jobs:
version: 6.8
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- uses: actions/cache@v3
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: go-test-${{ github.sha }}
restore-keys: |
go-test-
- name: Install go
uses: actions/setup-go@v4
uses: actions/setup-go@v5
with:
go-version: '^1'
cache: true

6
.github/workflows/hls-tests.yml

@ -24,10 +24,10 @@ jobs: @@ -24,10 +24,10 @@ jobs:
uses: fkirc/skip-duplicate-actions@v5
with:
concurrent_skipping: 'same_content_newer'
- uses: actions/checkout@v3
- uses: actions/setup-go@v4
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: '1.20'
go-version: '1.21'
cache: true
- name: Cache node modules

185
.github/workflows/javascript-format-build.yml

@ -0,0 +1,185 @@ @@ -0,0 +1,185 @@
name: Javascript
# This action works with pull requests and pushes
on:
push:
paths:
- web/**
- '!**.md'
pull_request:
paths:
- web/**
- '!**.md'
jobs:
formatting:
name: Code formatting
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./web
steps:
- id: skip_check
uses: fkirc/skip-duplicate-actions@v5
with:
concurrent_skipping: 'same_content_newer'
cancel_others: 'true'
skip_after_successful_duplicate: 'true'
- name: Checkout
uses: actions/checkout@v4
with:
# Make sure the actual branch is checked out when running on pull requests
ref: ${{ github.event.pull_request.head.ref }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
fetch-depth: 0
persist-credentials: true
- name: Get changed files
id: changed-files-yaml
uses: tj-actions/changed-files@v41
with:
path: 'web'
files_ignore: |
static/**
web/next.config.js
files_yaml: |
src:
- '**/*.{js,ts,tsx,jsx,css,md}'
- name: Cache node modules
uses: actions/cache@v3
env:
cache-name: cache-node-modules-bundle-web-app
with:
path: ~/.npm
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('web/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: Install Dependencies
run: npm install
- name: Lint
if: steps.changed-files-yaml.outputs.src_any_changed == 'true'
run: npx eslint --fix ${{ steps.changed-files-yaml.outputs.src_all_changed_files }}
- name: Prettier
if: steps.changed-files-yaml.outputs.src_any_changed == 'true'
run: npx prettier --write ${{ steps.changed-files-yaml.outputs.src_all_changed_files }}
- name: Commit changes
if: steps.changed-files-yaml.outputs.src_any_changed == 'true'
uses: EndBug/add-and-commit@v9
with:
author_name: Owncast
author_email: owncast@owncast.online
message: 'Javascript formatting autofixes'
add: ${{ steps.changed-files-yaml.outputs.src_all_changed_files }}
pull: '--rebase --autostash'
unused-code:
name: Test for unused code
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./web
steps:
- id: skip_check
uses: fkirc/skip-duplicate-actions@v5
with:
concurrent_skipping: 'same_content_newer'
cancel_others: 'true'
skip_after_successful_duplicate: 'true'
- name: Checkout
uses: actions/checkout@v4
with:
# Make sure the actual branch is checked out when running on pull requests
ref: ${{ github.event.pull_request.head.ref }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
fetch-depth: 0
- name: Cache node modules
uses: actions/cache@v3
env:
cache-name: cache-node-modules-bundle-web-app
with:
path: ~/.npm
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('web/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: Install Dependencies
run: npm install
- name: Check for unused JS code and dependencies
run: npx knip --include dependencies,files,exports
# After any formatting and linting is complete we can run the build
# and bundle step. This both will verify that the build is successful as
# well as commiting the updated static files into the repository for use.
web-bundle:
name: Build and bundle web project
runs-on: ubuntu-latest
if: github.repository == 'owncast/owncast'
needs: [formatting, unused-code]
steps:
- id: skip_check
uses: fkirc/skip-duplicate-actions@v5
with:
concurrent_skipping: 'same_content_newer'
cancel_others: 'true'
skip_after_successful_duplicate: 'true'
- name: Cache node modules
uses: actions/cache@v3
env:
cache-name: cache-node-modules-bundle-web-app
with:
path: ~/.npm
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('web/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: Checkout
uses: actions/checkout@v4
with:
# Make sure the actual branch is checked out when running on pull requests
ref: ${{ github.event.pull_request.head.ref }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
fetch-depth: 0
- name: Bundle web app (next.js build)
run: build/web/bundleWeb.sh
- name: Rebase
if: ${{ github.ref == 'refs/heads/develop' }}
run: |
git add static/web
git pull --rebase --autostash
# Only commit built web project files on develop.
- name: Commit changes
if: ${{ github.ref == 'refs/heads/develop' }}
uses: EndBug/add-and-commit@v9
with:
message: 'Bundle embedded web app'
add: 'static/web'
author_name: Owncast
author_email: owncast@owncast.online
- name: Push changes
if: ${{ github.ref == 'refs/heads/develop' }}
run: |
git pull --rebase --autostash
git push

96
.github/workflows/javascript-formatting.yml

@ -1,96 +0,0 @@ @@ -1,96 +0,0 @@
name: Lint
# This action works with pull requests and pushes
on:
push:
paths:
- web/**
pull_request_target:
paths:
- web/**
jobs:
prettier:
name: Javascript prettier
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./web
if: ${{ github.actor != 'dependabot[bot]' }}
steps:
- id: skip_check
uses: fkirc/skip-duplicate-actions@v5
with:
concurrent_skipping: 'same_content_newer'
- name: Checkout
uses: actions/checkout@v3
with:
# Make sure the actual branch is checked out when running on pull requests
ref: ${{ github.event.pull_request.head.ref }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
fetch-depth: 0
- name: Prettify code
uses: creyD/prettier_action@v4.3
with:
# This part is also where you can pass other options, for example:
prettier_options: --write **/*.{js,ts,jsx,tsx,css,md}
only_changed: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
linter:
name: Javascript linter
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./web
steps:
- id: skip_check
uses: fkirc/skip-duplicate-actions@v5
with:
concurrent_skipping: 'same_content_newer'
- name: Checkout
uses: actions/checkout@v3
with:
# Make sure the actual branch is checked out when running on pull requests
ref: ${{ github.event.pull_request.head.ref }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
fetch-depth: 0
- name: Install Dependencies
run: npm install
- name: Lint
run: npm run lint
unused-code:
name: Test for unused code
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./web
steps:
- id: skip_check
uses: fkirc/skip-duplicate-actions@v5
with:
concurrent_skipping: 'same_content_newer'
- name: Checkout
uses: actions/checkout@v3
with:
# Make sure the actual branch is checked out when running on pull requests
ref: ${{ github.event.pull_request.head.ref }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
fetch-depth: 0
- name: Install Dependencies
run: npm install
- name: Check for unused JS code and dependencies
run: npx knip --include dependencies,files,exports

4
.github/workflows/javascript-tests.yml

@ -18,9 +18,9 @@ jobs: @@ -18,9 +18,9 @@ jobs:
concurrent_skipping: 'same_content_newer'
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- uses: actions/setup-node@v3
- uses: actions/setup-node@v4
with:
node-version: 18.9.0

6
.github/workflows/screenshots.yml

@ -14,10 +14,10 @@ jobs: @@ -14,10 +14,10 @@ jobs:
Screenshots:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-go@v4
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: '1.20'
go-version: '1.21'
cache: true
- name: Cache node modules

4
.github/workflows/shellcheck.yml

@ -18,9 +18,9 @@ jobs: @@ -18,9 +18,9 @@ jobs:
env:
LANG: C.UTF-8
container:
image: docker.io/ubuntu:23.10
image: docker.io/ubuntu:24.04
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Install shellcheck
run: apt update && apt install -y shellcheck bash && shellcheck --version

50
.github/workflows/test-webapp-build.yaml

@ -1,50 +0,0 @@ @@ -1,50 +0,0 @@
name: Webapp Test Build
# This action works with pull requests and pushes
on:
push:
paths:
- web/**
pull_request:
paths:
- web/**
jobs:
build:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./web
name: Build webapp
steps:
- id: skip_check
uses: fkirc/skip-duplicate-actions@v5
with:
concurrent_skipping: 'same_content_newer'
- name: Checkout
uses: actions/checkout@v3
with:
# Make sure the actual branch is checked out when running on pull requests
ref: ${{ github.event.pull_request.head.ref }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
fetch-depth: 0
- name: Cache node modules
uses: actions/cache@v3
env:
cache-name: cache-node-modules-bundle-web-app
with:
path: ~/.npm
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('web/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: Install Dependencies
run: npm install
- name: Build
run: npm run build

1
.gitignore vendored

@ -42,6 +42,7 @@ test/automated/browser/screenshots @@ -42,6 +42,7 @@ test/automated/browser/screenshots
lefthook.yml
test/automated/browser/cypress/screenshots
test/automated/browser/cypress/videos
web/style-definitions/build/
web/public/sw.js
web/public/workbox-*.js

4
.golangci.yml

@ -5,7 +5,7 @@ run: @@ -5,7 +5,7 @@ run:
# Define the Go version limit.
# Mainly related to generics support in go1.18.
# Default: use Go version from the go.mod file, fallback on the env var `GOVERSION`, fallback on 1.18
go: '1.20'
go: '1.21'
issues:
# The linter has a default list of ignorable errors. Turning this on will enable that list.
@ -69,7 +69,7 @@ linters-settings: @@ -69,7 +69,7 @@ linters-settings:
gosimple:
# Select the Go version to target. The default is '1.13'.
go: '1.20'
go: '1.21'
# https://staticcheck.io/docs/options#checks
checks: ['all']

2
Dockerfile

@ -22,7 +22,7 @@ ENV NAME=${NAME} @@ -22,7 +22,7 @@ ENV NAME=${NAME}
RUN CGO_ENABLED=1 GOOS=linux go build -a -installsuffix cgo -ldflags "-extldflags \"-static\" -s -w -X github.com/owncast/owncast/config.GitCommit=$GIT_COMMIT -X github.com/owncast/owncast/config.VersionNumber=$VERSION -X github.com/owncast/owncast/config.BuildPlatform=$NAME" -o owncast .
# Create the image by copying the result of the build into a new alpine image
FROM alpine:3.18.0
FROM alpine:3.19.0
RUN apk update && apk add --no-cache ffmpeg ffmpeg-libs ca-certificates && update-ca-certificates
RUN addgroup -g 101 -S owncast && adduser -u 101 -S owncast -G owncast

24
Earthfile

@ -6,10 +6,10 @@ ARG version=develop @@ -6,10 +6,10 @@ ARG version=develop
WORKDIR /build
build-all:
BUILD --platform=linux/amd64 --platform=linux/386 --platform=linux/arm64 --platform=linux/arm/v7 --platform=darwin/amd64 +build
BUILD --platform=linux/amd64 --platform=linux/386 --platform=linux/arm64 --platform=linux/arm/v7 --platform=darwin/amd64 --platform=darwin/arm64 +build
package-all:
BUILD --platform=linux/amd64 --platform=linux/386 --platform=linux/arm64 --platform=linux/arm/v7 --platform=darwin/amd64 +package
BUILD --platform=linux/amd64 --platform=linux/386 --platform=linux/arm64 --platform=linux/arm/v7 --platform=darwin/amd64 --platform=darwin/arm64 +package
docker-all:
BUILD --platform=linux/amd64 --platform=linux/386 --platform=linux/arm64 --platform=linux/arm/v7 +docker
@ -36,7 +36,6 @@ build: @@ -36,7 +36,6 @@ build:
FROM --platform=linux/amd64 +code
RUN echo $EARTHLY_GIT_HASH
RUN echo "Finding CC configuration for $TARGETPLATFORM"
IF [ "$TARGETPLATFORM" = "linux/amd64" ]
ARG NAME=linux-64bit
@ -59,6 +58,10 @@ build: @@ -59,6 +58,10 @@ build:
ARG NAME=macOS-64bit
ARG CC=o64-clang
ARG CXX=o64-clang++
ELSE IF [ "$TARGETPLATFORM" = "darwin/arm64" ]
ARG NAME=macOS-arm64
ARG CC=o64-clang
ARG CXX=o64-clang++
ELSE
RUN echo "Failed to find CC configuration for $TARGETPLATFORM"
ARG --required CC
@ -76,10 +79,13 @@ build: @@ -76,10 +79,13 @@ build:
# MacOSX disallows static executables, so we omit the static flag on this platform
RUN go build -a -installsuffix cgo -ldflags "$([ "$GOOS"z != darwinz ] && echo "-linkmode external -extldflags -static ") -s -w -X github.com/owncast/owncast/config.GitCommit=$EARTHLY_GIT_HASH -X github.com/owncast/owncast/config.VersionNumber=$version -X github.com/owncast/owncast/config.BuildPlatform=$NAME" -tags sqlite_omit_load_extension -o owncast main.go
# Decrease the size of the shipped binary
RUN upx --best --lzma owncast
# Test the binary
RUN upx -t owncast
# Decrease the size of the shipped binary. But only for non-Apple platforms.
# See https://github.com/upx/upx/issues/612
IF [ "$GOOS" != "darwin" ]
RUN upx --best --lzma owncast
# Test the binary
RUN upx -t owncast
END
SAVE ARTIFACT owncast owncast
@ -97,6 +103,8 @@ package: @@ -97,6 +103,8 @@ package:
ARG NAME=linux-arm7
ELSE IF [ "$TARGETPLATFORM" = "darwin/amd64" ]
ARG NAME=macOS-64bit
ELSE IF [ "$TARGETPLATFORM" = "darwin/arm64" ]
ARG NAME=macOS-arm64
ELSE
ARG NAME=custom
END
@ -104,7 +112,7 @@ package: @@ -104,7 +112,7 @@ package:
COPY (+build/owncast --platform $TARGETPLATFORM) /build/dist/owncast
ENV ZIPNAME owncast-$version-$NAME.zip
RUN cd /build/dist && zip -r -q -8 /build/dist/owncast.zip .
SAVE ARTIFACT /build/dist/owncast.zip owncast.zip AS LOCAL dist/$ZIPNAME
SAVE ARTIFACT --keep-ts /build/dist/owncast.zip owncast.zip AS LOCAL dist/$ZIPNAME
docker:
# Multiple image names can be tagged at once. They should all be passed

6
README.md

@ -48,8 +48,8 @@ Owncast is an open source, self-hosted, decentralized, single user live video st @@ -48,8 +48,8 @@ Owncast is an open source, self-hosted, decentralized, single user live video st
<div>
<img alt="GitHub all releases" src="https://img.shields.io/github/downloads/owncast/owncast/total?style=for-the-badge">
<a href="https://hub.docker.com/r/gabekangas/owncast">
<img alt="Docker Pulls" src="https://img.shields.io/docker/pulls/gabekangas/owncast?style=for-the-badge">
<a href="https://hub.docker.com/r/owncast/owncast">
<img alt="Docker Pulls" src="https://img.shields.io/docker/pulls/owncast/owncast?style=for-the-badge">
</a>
<a href="https://github.com/owncast/owncast/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22">
<img alt="GitHub issues by-label" src="https://img.shields.io/github/issues-raw/owncast/owncast/good%20first%20issue?style=for-the-badge">
@ -95,7 +95,7 @@ The Owncast backend is a service written in Go. @@ -95,7 +95,7 @@ The Owncast backend is a service written in Go.
1. Ensure you have prerequisites installed.
- C compiler, such as [GCC compiler](https://gcc.gnu.org/install/download.html) or a [Musl-compatible compiler](https://musl.libc.org/)
- [ffmpeg](https://ffmpeg.org/download.html)
1. Install the [Go toolchain](https://golang.org/dl/) (1.20 or above).
1. Install the [Go toolchain](https://golang.org/dl/) (1.21 or above).
1. Clone the repo. `git clone https://github.com/owncast/owncast`
1. `go run main.go` will run from the source.
1. Visit `http://yourserver:8080` to access the web interface or `http://yourserver:8080/admin` to access the admin.

8
activitypub/inbox/like.go

@ -13,6 +13,14 @@ import ( @@ -13,6 +13,14 @@ import (
func handleLikeRequest(c context.Context, activity vocab.ActivityStreamsLike) error {
object := activity.GetActivityStreamsObject()
actorReference := activity.GetActivityStreamsActor()
if object.Len() < 1 {
return errors.New("like activity is missing object")
}
if actorReference.Len() < 1 {
return errors.New("like activity is missing actor")
}
objectIRI := object.At(0).GetIRI().String()
actorIRI := actorReference.At(0).GetIRI().String()

10
activitypub/inbox/workerpool.go

@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
package inbox
import (
"runtime"
"github.com/owncast/owncast/activitypub/apmodels"
log "github.com/sirupsen/logrus"
)
const (
// InboxWorkerPoolSize defines the number of concurrent ActivityPub handlers.
InboxWorkerPoolSize = 10
)
// workerPoolSize defines the number of concurrent ActivityPub handlers.
var workerPoolSize = runtime.GOMAXPROCS(0)
// Job struct bundling the ActivityPub and the payload in one struct.
type Job struct {
@ -22,7 +22,7 @@ func InitInboxWorkerPool() { @@ -22,7 +22,7 @@ func InitInboxWorkerPool() {
queue = make(chan Job)
// start workers
for i := 1; i <= InboxWorkerPoolSize; i++ {
for i := 1; i <= workerPoolSize; i++ {
go worker(i, queue)
}
}

2
activitypub/outbox/outbox.go

@ -60,7 +60,7 @@ func SendLive() error { @@ -60,7 +60,7 @@ func SendLive() error {
if title := data.GetStreamTitle(); title != "" {
streamTitle = fmt.Sprintf("<p>%s</p>", title)
}
textContent = fmt.Sprintf("<p>%s</p>%s<p>%s</p><a href=\"%s\">%s</a>", textContent, streamTitle, tagsString, data.GetServerURL(), data.GetServerURL())
textContent = fmt.Sprintf("<p>%s</p>%s<p>%s</p><p><a href=\"%s\">%s</a></p>", textContent, streamTitle, tagsString, data.GetServerURL(), data.GetServerURL())
activity, _, note, noteID := createBaseOutboundMessage(textContent)

8
activitypub/webfinger/webfinger.go

@ -2,10 +2,13 @@ package webfinger @@ -2,10 +2,13 @@ package webfinger
import (
"encoding/json"
"errors"
"fmt"
"net/http"
"net/url"
"strings"
"github.com/owncast/owncast/utils"
)
// GetWebfingerLinks will return webfinger data for an account.
@ -18,6 +21,11 @@ func GetWebfingerLinks(account string) ([]map[string]interface{}, error) { @@ -18,6 +21,11 @@ func GetWebfingerLinks(account string) ([]map[string]interface{}, error) {
accountComponents := strings.Split(account, "@")
fediverseServer := accountComponents[1]
// Reject any requests to our internal network or loopback.
if utils.IsHostnameInternal(fediverseServer) {
return nil, errors.New("unable to use provided host as a valid fediverse server")
}
// HTTPS is required.
requestURL, err := url.Parse("https://" + fediverseServer)
if err != nil {

9
activitypub/workerpool/outbound.go

@ -2,14 +2,13 @@ package workerpool @@ -2,14 +2,13 @@ package workerpool
import (
"net/http"
"runtime"
log "github.com/sirupsen/logrus"
)
const (
// ActivityPubWorkerPoolSize defines the number of concurrent HTTP ActivityPub requests.
ActivityPubWorkerPoolSize = 10
)
// workerPoolSize defines the number of concurrent HTTP ActivityPub requests.
var workerPoolSize = runtime.GOMAXPROCS(0)
// Job struct bundling the ActivityPub and the payload in one struct.
type Job struct {
@ -23,7 +22,7 @@ func InitOutboundWorkerPool() { @@ -23,7 +22,7 @@ func InitOutboundWorkerPool() {
queue = make(chan Job)
// start workers
for i := 1; i <= ActivityPubWorkerPoolSize; i++ {
for i := 1; i <= workerPoolSize; i++ {
go worker(i, queue)
}
}

18
auth/indieauth/client.go

@ -12,6 +12,7 @@ import ( @@ -12,6 +12,7 @@ import (
"time"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/utils"
"github.com/pkg/errors"
log "github.com/sirupsen/logrus"
)
@ -46,10 +47,27 @@ func setupExpiredRequestPruner() { @@ -46,10 +47,27 @@ func setupExpiredRequestPruner() {
// StartAuthFlow will begin the IndieAuth flow by generating an auth request.
func StartAuthFlow(authHost, userID, accessToken, displayName string) (*url.URL, error) {
// Limit the number of pending requests
if len(pendingAuthRequests) >= maxPendingRequests {
return nil, errors.New("Please try again later. Too many pending requests.")
}
// Reject any requests to our internal network or loopback
if utils.IsHostnameInternal(authHost) {
return nil, errors.New("unable to use provided host")
}
// Santity check the server URL
u, err := url.ParseRequestURI(authHost)
if err != nil {
return nil, errors.New("unable to parse server URL")
}
// Limit to only secured connections
if u.Scheme != "https" {
return nil, errors.New("only servers secured with https are supported")
}
serverURL := data.GetServerURL()
if serverURL == "" {
return nil, errors.New("Owncast server URL must be set when using auth")

2
auth/indieauth/server.go

@ -40,7 +40,7 @@ type ServerProfileResponse struct { @@ -40,7 +40,7 @@ type ServerProfileResponse struct {
var pendingServerAuthRequests = map[string]ServerAuthRequest{}
const maxPendingRequests = 1000
const maxPendingRequests = 100
// StartServerAuth will handle the authentication for the admin user of this
// Owncast server. Initiated via a GET of the auth endpoint.

6
auth/persistence.go

@ -5,7 +5,7 @@ import ( @@ -5,7 +5,7 @@ import (
"strings"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/core/user"
"github.com/owncast/owncast/db"
)
@ -39,7 +39,7 @@ func AddAuth(userID, authToken string, authType Type) error { @@ -39,7 +39,7 @@ func AddAuth(userID, authToken string, authType Type) error {
// GetUserByAuth will return an existing user given auth details if a user
// has previously authenticated with that method.
func GetUserByAuth(authToken string, authType Type) *models.User {
func GetUserByAuth(authToken string, authType Type) *user.User {
u, err := _datastore.GetQueries().GetUserByAuth(context.Background(), db.GetUserByAuthParams{
Token: authToken,
Type: string(authType),
@ -53,7 +53,7 @@ func GetUserByAuth(authToken string, authType Type) *models.User { @@ -53,7 +53,7 @@ func GetUserByAuth(authToken string, authType Type) *models.User {
scopes = strings.Split(u.Scopes.String, ",")
}
return &models.User{
return &user.User{
ID: u.ID,
DisplayName: u.DisplayName,
DisplayColor: int(u.DisplayColor),

18
build/web/bundleWeb.sh

@ -5,17 +5,29 @@ set -o errexit @@ -5,17 +5,29 @@ set -o errexit
set -o nounset
set -o pipefail
OFFLINE=
while [[ $# -gt 0 ]]; do
case $1 in
--offline)
OFFLINE=1
;;
esac
shift
done
# Change to the root directory of the repository
cd "$(git rev-parse --show-toplevel)"
cd web
echo "Installing npm modules for the owncast web..."
npm --silent install 2>/dev/null
if [ ! "$OFFLINE" ]; then
echo "Installing npm modules for the owncast web..."
npm --silent install 2>/dev/null
fi
echo "Building owncast web..."
rm -rf .next
(node_modules/.bin/next build && node_modules/.bin/next export) | grep info
node_modules/.bin/next build | grep info
echo "Copying web project to dist directory..."

2
config/constants.go

@ -4,7 +4,7 @@ import "path/filepath" @@ -4,7 +4,7 @@ import "path/filepath"
const (
// StaticVersionNumber is the version of Owncast that is used when it's not overwritten via build-time settings.
StaticVersionNumber = "0.1.1" // Shown when you build from develop
StaticVersionNumber = "0.1.3" // Shown when you build from develop
// FfmpegSuggestedVersion is the version of ffmpeg we suggest.
FfmpegSuggestedVersion = "v4.1.5" // Requires the v
// DataDirectory is the directory we save data to.

4
config/verifyInstall.go

@ -29,8 +29,8 @@ func VerifyFFMpegPath(path string) error { @@ -29,8 +29,8 @@ func VerifyFFMpegPath(path string) error {
}
mode := stat.Mode()
//source: https://stackoverflow.com/a/60128480
if mode&0111 == 0 {
// source: https://stackoverflow.com/a/60128480
if mode&0o111 == 0 {
return errors.New("ffmpeg path is not executable")
}

2
contrib/owncast_for_windows.md

@ -43,7 +43,7 @@ Here is the list for all the prerequisites required -> @@ -43,7 +43,7 @@ Here is the list for all the prerequisites required ->
- npm (Node Package Manager) is installed as `sudo apt install npm`.
- Node.js is installed (LTS Version) `sudo apt install nodejs`.
- [ffmpeg](https://ffmpeg.org/download.html)
- Install the [Go toolchain](https://golang.org/dl/) (1.20 or above).
- Install the [Go toolchain](https://golang.org/dl/) (1.21 or above).
### Read more

12
controllers/admin/chat.go

@ -31,6 +31,7 @@ func UpdateMessageVisibility(w http.ResponseWriter, r *http.Request) { @@ -31,6 +31,7 @@ func UpdateMessageVisibility(w http.ResponseWriter, r *http.Request) {
}
if r.Method != controllers.POST {
// nolint:goconst
controllers.WriteSimpleResponse(w, false, r.Method+" not supported")
return
}
@ -164,12 +165,17 @@ func UpdateUserEnabled(w http.ResponseWriter, r *http.Request) { @@ -164,12 +165,17 @@ func UpdateUserEnabled(w http.ResponseWriter, r *http.Request) {
disconnectedUser := user.GetUserByID(request.UserID)
_ = chat.SendSystemAction(fmt.Sprintf("**%s** has been removed from chat.", disconnectedUser.DisplayName), true)
localIP4Address := "127.0.0.1"
localIP6Address := "::1"
// Ban this user's IP address.
for _, client := range clients {
ipAddress := client.IPAddress
reason := fmt.Sprintf("Banning of %s", disconnectedUser.DisplayName)
if err := data.BanIPAddress(ipAddress, reason); err != nil {
log.Errorln("error banning IP address: ", err)
if ipAddress != localIP4Address && ipAddress != localIP6Address {
reason := fmt.Sprintf("Banning of %s", disconnectedUser.DisplayName)
if err := data.BanIPAddress(ipAddress, reason); err != nil {
log.Errorln("error banning IP address: ", err)
}
}
}
}

21
controllers/admin/config.go

@ -5,6 +5,7 @@ import ( @@ -5,6 +5,7 @@ import (
"fmt"
"net"
"net/http"
"net/netip"
"os"
"path/filepath"
"reflect"
@ -406,6 +407,14 @@ func SetServerURL(w http.ResponseWriter, r *http.Request) { @@ -406,6 +407,14 @@ func SetServerURL(w http.ResponseWriter, r *http.Request) {
return
}
// Block Private IP URLs
ipAddr, ipErr := netip.ParseAddr(utils.GetHostnameWithoutPortFromURLString(rawValue))
if ipErr == nil && ipAddr.IsPrivate() {
controllers.WriteSimpleResponse(w, false, "Server URL cannot be private")
return
}
// Trim any trailing slash
serverURL := strings.TrimRight(rawValue, "/")
@ -850,6 +859,18 @@ func SetStreamKeys(w http.ResponseWriter, r *http.Request) { @@ -850,6 +859,18 @@ func SetStreamKeys(w http.ResponseWriter, r *http.Request) {
return
}
if len(streamKeys.Value) == 0 {
controllers.WriteSimpleResponse(w, false, "must provide at least one valid stream key")
return
}
for _, streamKey := range streamKeys.Value {
if streamKey.Key == "" {
controllers.WriteSimpleResponse(w, false, "stream key cannot be empty")
return
}
}
if err := data.SetStreamKeys(streamKeys.Value); err != nil {
controllers.WriteSimpleResponse(w, false, err.Error())
return

2
controllers/admin/serverConfig.go

@ -57,7 +57,7 @@ func GetServerConfig(w http.ResponseWriter, r *http.Request) { @@ -57,7 +57,7 @@ func GetServerConfig(w http.ResponseWriter, r *http.Request) {
WebServerIP: config.WebServerIP,
RTMPServerPort: data.GetRTMPPortNumber(),
ChatDisabled: data.GetChatDisabled(),
ChatJoinMessagesEnabled: data.GetChatJoinMessagesEnabled(),
ChatJoinMessagesEnabled: data.GetChatJoinPartMessagesEnabled(),
SocketHostOverride: data.GetWebsocketOverrideHost(),
VideoServingEndpoint: data.GetVideoServingEndpoint(),
ChatEstablishedUserMode: data.GetChatEstbalishedUsersOnlyMode(),

1
controllers/chat.go

@ -54,6 +54,7 @@ func RegisterAnonymousChatUser(w http.ResponseWriter, r *http.Request) { @@ -54,6 +54,7 @@ func RegisterAnonymousChatUser(w http.ResponseWriter, r *http.Request) {
}
if r.Method != http.MethodPost {
// nolint:goconst
WriteSimpleResponse(w, false, r.Method+" not supported")
return
}

14
controllers/config.go

@ -17,25 +17,25 @@ import ( @@ -17,25 +17,25 @@ import (
type webConfigResponse struct {
AppearanceVariables map[string]string `json:"appearanceVariables"`
Notifications notificationsConfigResponse `json:"notifications"`
Name string `json:"name"`
CustomStyles string `json:"customStyles"`
Summary string `json:"summary"`
StreamTitle string `json:"streamTitle,omitempty"` // What's going on with the current stream
OfflineMessage string `json:"offlineMessage"`
Logo string `json:"logo"`
Version string `json:"version"`
SocketHostOverride string `json:"socketHostOverride,omitempty"`
ExtraPageContent string `json:"extraPageContent"`
StreamTitle string `json:"streamTitle,omitempty"` // What's going on with the current stream
Name string `json:"name"`
Federation federationConfigResponse `json:"federation"`
Summary string `json:"summary"`
Tags []string `json:"tags"`
SocialHandles []models.SocialHandle `json:"socialHandles"`
ExternalActions []models.ExternalAction `json:"externalActions"`
Tags []string `json:"tags"`
Notifications notificationsConfigResponse `json:"notifications"`
Federation federationConfigResponse `json:"federation"`
MaxSocketPayloadSize int `json:"maxSocketPayloadSize"`
HideViewerCount bool `json:"hideViewerCount"`
ChatDisabled bool `json:"chatDisabled"`
NSFW bool `json:"nsfw"`
Authentication authenticationConfigResponse `json:"authentication"`
HideViewerCount bool `json:"hideViewerCount"`
}
type federationConfigResponse struct {

3
controllers/emoji.go

@ -8,11 +8,13 @@ import ( @@ -8,11 +8,13 @@ import (
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/router/middleware"
)
// GetCustomEmojiList returns a list of emoji via the API.
func GetCustomEmojiList(w http.ResponseWriter, r *http.Request) {
emojiList := data.GetEmojiList()
middleware.SetCachingHeaders(w, r)
if err := json.NewEncoder(w).Encode(emojiList); err != nil {
InternalErrorHandler(w, err)
@ -25,5 +27,6 @@ func GetCustomEmojiImage(w http.ResponseWriter, r *http.Request) { @@ -25,5 +27,6 @@ func GetCustomEmojiImage(w http.ResponseWriter, r *http.Request) {
r.URL.Path = path
emojiFS := os.DirFS(config.CustomEmojiPath)
middleware.SetCachingHeaders(w, r)
http.FileServer(http.FS(emojiFS)).ServeHTTP(w, r)
}

98
controllers/index.go

@ -4,13 +4,18 @@ import ( @@ -4,13 +4,18 @@ import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"path/filepath"
"strings"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/router/middleware"
"github.com/owncast/owncast/static"
"github.com/owncast/owncast/utils"
log "github.com/sirupsen/logrus"
)
// IndexHandler handles the default index route.
@ -24,6 +29,13 @@ func IndexHandler(w http.ResponseWriter, r *http.Request) { @@ -24,6 +29,13 @@ func IndexHandler(w http.ResponseWriter, r *http.Request) {
return
}
// For search engine bots and social scrapers return a special
// server-rendered page.
if utils.IsUserAgentABot(r.UserAgent()) && isIndexRequest {
handleScraperMetadataPage(w, r)
return
}
// Set a cache control max-age header
middleware.SetCachingHeaders(w, r)
@ -51,6 +63,7 @@ func renderIndexHtml(w http.ResponseWriter, nonce string) { @@ -51,6 +63,7 @@ func renderIndexHtml(w http.ResponseWriter, nonce string) {
Image string
StatusJSON string
ServerConfigJSON string
EmbedVideo string
Nonce string
}
@ -71,13 +84,14 @@ func renderIndexHtml(w http.ResponseWriter, nonce string) { @@ -71,13 +84,14 @@ func renderIndexHtml(w http.ResponseWriter, nonce string) {
content := serverSideContent{
Name: data.GetServerName(),
Summary: data.GetServerSummary(),
RequestedURL: data.GetServerURL(),
RequestedURL: fmt.Sprintf("%s%s", data.GetServerURL(), "/"),
TagsString: strings.Join(data.GetServerMetadataTags(), ","),
ThumbnailURL: "/thumbnail.jpg",
Thumbnail: "/thumbnail.jpg",
Image: "/logo/external",
ThumbnailURL: "thumbnail.jpg",
Thumbnail: "thumbnail.jpg",
Image: "logo/external",
StatusJSON: string(sb),
ServerConfigJSON: string(cb),
EmbedVideo: "embed/video",
Nonce: nonce,
}
@ -91,3 +105,79 @@ func renderIndexHtml(w http.ResponseWriter, nonce string) { @@ -91,3 +105,79 @@ func renderIndexHtml(w http.ResponseWriter, nonce string) {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
// MetadataPage represents a server-rendered web page for bots and web scrapers.
type MetadataPage struct {
RequestedURL string
Image string
Thumbnail string
TagsString string
Summary string
Name string
Tags []string
SocialHandles []models.SocialHandle
}
// Return a basic HTML page with server-rendered metadata from the config
// to give to Opengraph clients and web scrapers (bots, web crawlers, etc).
func handleScraperMetadataPage(w http.ResponseWriter, r *http.Request) {
tmpl, err := static.GetBotMetadataTemplate()
if err != nil {
log.Errorln(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
scheme := "http"
if siteURL := data.GetServerURL(); siteURL != "" {
if parsed, err := url.Parse(siteURL); err == nil && parsed.Scheme != "" {
scheme = parsed.Scheme
}
}
fullURL, err := url.Parse(fmt.Sprintf("%s://%s%s", scheme, r.Host, r.URL.Path))
if err != nil {
log.Errorln(err)
}
imageURL, err := url.Parse(fmt.Sprintf("%s://%s%s", scheme, r.Host, "/logo/external"))
if err != nil {
log.Errorln(err)
}
status := core.GetStatus()
// If the thumbnail does not exist or we're offline then just use the logo image
var thumbnailURL string
if status.Online && utils.DoesFileExists(filepath.Join(config.DataDirectory, "tmp", "thumbnail.jpg")) {
thumbnail, err := url.Parse(fmt.Sprintf("%s://%s%s", scheme, r.Host, "/thumbnail.jpg"))
if err != nil {
log.Errorln(err)
thumbnailURL = imageURL.String()
} else {
thumbnailURL = thumbnail.String()
}
} else {
thumbnailURL = imageURL.String()
}
tagsString := strings.Join(data.GetServerMetadataTags(), ",")
metadata := MetadataPage{
Name: data.GetServerName(),
RequestedURL: fullURL.String(),
Image: imageURL.String(),
Summary: data.GetServerSummary(),
Thumbnail: thumbnailURL,
TagsString: tagsString,
Tags: data.GetServerMetadataTags(),
SocialHandles: data.GetSocialHandles(),
}
// Set a cache header
middleware.SetCachingHeaders(w, r)
w.Header().Set("Content-Type", "text/html")
if err := tmpl.Execute(w, metadata); err != nil {
log.Errorln(err)
}
}

4
core/chat/chatclient.go

@ -13,8 +13,8 @@ import ( @@ -13,8 +13,8 @@ import (
"github.com/gorilla/websocket"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/chat/events"
"github.com/owncast/owncast/core/user"
"github.com/owncast/owncast/geoip"
"github.com/owncast/owncast/models"
)
// Client represents a single chat client.
@ -23,7 +23,7 @@ type Client struct { @@ -23,7 +23,7 @@ type Client struct {
timeoutTimer *time.Timer
rateLimiter *rate.Limiter
conn *websocket.Conn
User *models.User `json:"user"`
User *user.User `json:"user"`
server *Server
Geo *geoip.GeoDetails `json:"geo"`
// Buffered channel of outbound messages.

19
core/chat/events.go

@ -9,8 +9,8 @@ import ( @@ -9,8 +9,8 @@ import (
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/chat/events"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/core/user"
"github.com/owncast/owncast/core/webhooks"
"github.com/owncast/owncast/storage"
"github.com/owncast/owncast/utils"
log "github.com/sirupsen/logrus"
)
@ -26,7 +26,6 @@ func (s *Server) userNameChanged(eventData chatClientEvent) { @@ -26,7 +26,6 @@ func (s *Server) userNameChanged(eventData chatClientEvent) {
// Check if name is on the blocklist
blocklist := data.GetForbiddenUsernameList()
userRepository := storage.GetUserRepository()
// Names have a max length
proposedUsername = utils.MakeSafeStringOfLength(proposedUsername, config.MaxChatDisplayNameLength)
@ -48,7 +47,7 @@ func (s *Server) userNameChanged(eventData chatClientEvent) { @@ -48,7 +47,7 @@ func (s *Server) userNameChanged(eventData chatClientEvent) {
}
// Check if the name is not already assigned to a registered user.
if available, err := userRepository.IsDisplayNameAvailable(proposedUsername); err != nil {
if available, err := user.IsDisplayNameAvailable(proposedUsername); err != nil {
log.Errorln("error checking if name is available", err)
return
} else if !available {
@ -61,11 +60,17 @@ func (s *Server) userNameChanged(eventData chatClientEvent) { @@ -61,11 +60,17 @@ func (s *Server) userNameChanged(eventData chatClientEvent) {
return
}
savedUser := userRepository.GetUserByToken(eventData.client.accessToken)
savedUser := user.GetUserByToken(eventData.client.accessToken)
oldName := savedUser.DisplayName
// Check that the new name is different from old.
if proposedUsername == oldName {
eventData.client.sendConnectedClientInfo()
return
}
// Save the new name
if err := userRepository.ChangeUsername(eventData.client.User.ID, proposedUsername); err != nil {
if err := user.ChangeUsername(eventData.client.User.ID, proposedUsername); err != nil {
log.Errorln("error changing username", err)
}
@ -109,10 +114,9 @@ func (s *Server) userColorChanged(eventData chatClientEvent) { @@ -109,10 +114,9 @@ func (s *Server) userColorChanged(eventData chatClientEvent) {
log.Errorln("invalid color requested when changing user display color")
return
}
userRepository := storage.GetUserRepository()
// Save the new color
if err := userRepository.ChangeUserColor(eventData.client.User.ID, receivedEvent.NewColor); err != nil {
if err := user.ChangeUserColor(eventData.client.User.ID, receivedEvent.NewColor); err != nil {
log.Errorln("error changing user display color", err)
}
@ -163,7 +167,6 @@ func (s *Server) userMessageSent(eventData chatClientEvent) { @@ -163,7 +167,6 @@ func (s *Server) userMessageSent(eventData chatClientEvent) {
SaveUserMessage(event)
eventData.client.MessageCount++
_lastSeenCache[event.User.ID] = time.Now()
}
func logSanitize(userValue string) string {

4
core/chat/events/connectedClientInfo.go

@ -1,9 +1,9 @@ @@ -1,9 +1,9 @@
package events
import "github.com/owncast/owncast/models"
import "github.com/owncast/owncast/core/user"
// ConnectedClientInfo represents the information about a connected client.
type ConnectedClientInfo struct {
User *user.User `json:"user"`
Event
User *models.User `json:"user"`
}

139
core/chat/events/events.go

@ -4,16 +4,23 @@ import ( @@ -4,16 +4,23 @@ import (
"bytes"
"regexp"
"strings"
"sync"
"text/template"
"time"
"github.com/microcosm-cc/bluemonday"
"github.com/owncast/owncast/models"
"github.com/teris-io/shortid"
"github.com/yuin/goldmark"
emoji "github.com/yuin/goldmark-emoji"
emojiAst "github.com/yuin/goldmark-emoji/ast"
emojiDef "github.com/yuin/goldmark-emoji/definition"
"github.com/yuin/goldmark/extension"
"github.com/yuin/goldmark/renderer/html"
"github.com/yuin/goldmark/util"
"mvdan.cc/xurls"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/core/user"
log "github.com/sirupsen/logrus"
)
@ -35,9 +42,9 @@ type Event struct { @@ -35,9 +42,9 @@ type Event struct {
// UserEvent is an event with an associated user.
type UserEvent struct {
User *models.User `json:"user"`
HiddenAt *time.Time `json:"hiddenAt,omitempty"`
ClientID uint `json:"clientId,omitempty"`
User *user.User `json:"user"`
HiddenAt *time.Time `json:"hiddenAt,omitempty"`
ClientID uint `json:"clientId,omitempty"`
}
// MessageEvent is an event that has a message body.
@ -66,6 +73,105 @@ func (e *UserMessageEvent) SetDefaults() { @@ -66,6 +73,105 @@ func (e *UserMessageEvent) SetDefaults() {
e.RenderAndSanitizeMessageBody()
}
// implements the emojiDef.Emojis interface but uses case-insensitive search.
// the .children field isn't currently used, but could be used in a future
// implementation of say, emoji packs where a child represents a pack.
type emojis struct {
list []emojiDef.Emoji
names map[string]*emojiDef.Emoji
children []emojiDef.Emojis
}
// return a new Emojis set.
func newEmojis(emotes ...emojiDef.Emoji) emojiDef.Emojis {
self := &emojis{
list: emotes,
names: map[string]*emojiDef.Emoji{},
children: []emojiDef.Emojis{},
}
for i := range self.list {
emoji := &self.list[i]
for _, s := range emoji.ShortNames {
self.names[s] = emoji
}
}
return self
}
func (self *emojis) Get(shortName string) (*emojiDef.Emoji, bool) {
v, ok := self.names[strings.ToLower(shortName)]
if ok {
return v, ok
}
for _, child := range self.children {
v, ok := child.Get(shortName)
if ok {
return v, ok
}
}
return nil, false
}
func (self *emojis) Add(emotes emojiDef.Emojis) {
self.children = append(self.children, emotes)
}
func (self *emojis) Clone() emojiDef.Emojis {
clone := &emojis{
list: self.list,
names: self.names,
children: make([]emojiDef.Emojis, len(self.children)),
}
copy(clone.children, self.children)
return clone
}
var (
emojiMu sync.Mutex
emojiDefs = newEmojis()
emojiHTML = make(map[string]string)
emojiModTime time.Time
emojiHTMLFormat = `<img src="{{ .URL }}" class="emoji" alt=":{{ .Name }}:" title=":{{ .Name }}:">`
emojiHTMLTemplate = template.Must(template.New("emojiHTML").Parse(emojiHTMLFormat))
)
func loadEmoji() {
modTime, err := data.UpdateEmojiList(false)
if err != nil {
return
}
if modTime.After(emojiModTime) {
emojiMu.Lock()
defer emojiMu.Unlock()
emojiHTML = make(map[string]string)
emojiList := data.GetEmojiList()
emojiArr := make([]emojiDef.Emoji, 0)
for i := 0; i < len(emojiList); i++ {
var buf bytes.Buffer
err := emojiHTMLTemplate.Execute(&buf, emojiList[i])
if err != nil {
return
}
emojiHTML[strings.ToLower(emojiList[i].Name)] = buf.String()
emoji := emojiDef.NewEmoji(emojiList[i].Name, nil, strings.ToLower(emojiList[i].Name))
emojiArr = append(emojiArr, emoji)
}
emojiDefs = newEmojis(emojiArr...)
}
}
// RenderAndSanitizeMessageBody will turn markdown into HTML, sanitize raw user-supplied HTML and standardize
// the message into something safe and renderable for clients.
func (m *MessageEvent) RenderAndSanitizeMessageBody() {
@ -98,6 +204,11 @@ func RenderAndSanitize(raw string) string { @@ -98,6 +204,11 @@ func RenderAndSanitize(raw string) string {
// RenderMarkdown will return HTML rendered from the string body of a chat message.
func RenderMarkdown(raw string) string {
loadEmoji()
emojiMu.Lock()
defer emojiMu.Unlock()
markdown := goldmark.New(
goldmark.WithRendererOptions(
html.WithUnsafe(),
@ -112,6 +223,16 @@ func RenderMarkdown(raw string) string { @@ -112,6 +223,16 @@ func RenderMarkdown(raw string) string {
xurls.Strict,
),
),
emoji.New(
emoji.WithEmojis(
emojiDefs,
),
emoji.WithRenderingMethod(emoji.Func),
emoji.WithRendererFunc(func(w util.BufWriter, source []byte, n *emojiAst.Emoji, config *emoji.RendererConfig) {
baseName := n.Value.ShortNames[0]
_, _ = w.WriteString(emojiHTML[baseName])
}),
),
),
)
@ -125,9 +246,9 @@ func RenderMarkdown(raw string) string { @@ -125,9 +246,9 @@ func RenderMarkdown(raw string) string {
}
var (
_sanitizeReSrcMatch = regexp.MustCompile(`(?i)^/img/emoji/[^\.%]*.[A-Z]*$`)
_sanitizeReAltTitleMatch = regexp.MustCompile(`:\S+:`)
_sanitizeReClassMatch = regexp.MustCompile(`(?i)^(emoji)[A-Z_]*?$`)
_sanitizeReSrcMatch = regexp.MustCompile(`(?i)^/img/emoji/[^\.%]*.[A-Z]*$`)
_sanitizeReClassMatch = regexp.MustCompile(`(?i)^(emoji)[A-Z_]*?$`)
_sanitizeNonEmptyMatch = regexp.MustCompile(`^.+$`)
)
func sanitize(raw string) string {
@ -149,11 +270,11 @@ func sanitize(raw string) string { @@ -149,11 +270,11 @@ func sanitize(raw string) string {
// Allow breaks
p.AllowElements("br")
p.AllowElementsContent("p")
p.AllowElements("p")
// Allow img tags from the the local emoji directory only
p.AllowAttrs("src").Matching(_sanitizeReSrcMatch).OnElements("img")
p.AllowAttrs("alt", "title").Matching(_sanitizeReAltTitleMatch).OnElements("img")
p.AllowAttrs("alt", "title").Matching(_sanitizeNonEmptyMatch).OnElements("img")
p.AllowAttrs("class").Matching(_sanitizeReClassMatch).OnElements("img")
// Allow bold

4
core/chat/events/eventtype.go

@ -8,6 +8,8 @@ const ( @@ -8,6 +8,8 @@ const (
MessageSent EventType = "CHAT"
// UserJoined is the event sent when a chat user join action takes place.
UserJoined EventType = "USER_JOINED"
// UserParted is the event sent when a chat user part action takes place.
UserParted EventType = "USER_PARTED"
// UserNameChanged is the event sent when a chat username change takes place.
UserNameChanged EventType = "NAME_CHANGE"
// UserColorChanged is the event sent when a chat user color change takes place.
@ -33,7 +35,7 @@ const ( @@ -33,7 +35,7 @@ const (
// ChatActionSent is a generic chat action that can be used for anything that doesn't need specific handling or formatting.
ChatActionSent EventType = "CHAT_ACTION"
// ErrorNeedsRegistration is an error returned when the client needs to perform registration.
ErrorNeedsRegistration EventType = "ERROR_NEEDS_REGISTRATION"
ErrorNeedsRegistration EventType = "ERROR_NEEDS_REGISTRATION" // nolint:gosec
// ErrorMaxConnectionsExceeded is an error returned when the server determined it should not handle more connections.
ErrorMaxConnectionsExceeded EventType = "ERROR_MAX_CONNECTIONS_EXCEEDED"
// ErrorUserDisabled is an error returned when the connecting user has been previously banned/disabled.

17
core/chat/events/userPartEvent.go

@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
package events
// UserPartEvent is the event fired when a user leaves chat.
type UserPartEvent struct {
Event
UserEvent
}
// GetBroadcastPayload will return the object to send to all chat users.
func (e *UserPartEvent) GetBroadcastPayload() EventPayload {
return EventPayload{
"type": UserParted,
"id": e.ID,
"timestamp": e.Timestamp,
"user": e.User,
}
}

25
core/chat/messageRendering_test.go

@ -10,20 +10,17 @@ import ( @@ -10,20 +10,17 @@ import (
// and fully rendered HTML out of it.
func TestRenderAndSanitize(t *testing.T) {
messageContent := `
Test one two three! I go to http://yahoo.com and search for _sports_ and **answers**.
Here is an iframe <iframe src="http://yahoo.com"></iframe>
## blah blah blah
[test link](http://owncast.online)
<img class="emoji" alt="bananadance.gif" width="600px" src="/img/emoji/bananadance.gif">
<script src="http://hackers.org/hack.js"></script>
`
Test one two three! I go to http://yahoo.com and search for _sports_ and **answers**.
Here is an iframe<iframe src="http://yahoo.com"></iframe>
## blah blah blah
[test link](http://owncast.online)
<img class="emoji" src="/img/emoji/bananadance.gif">`
expected := `Test one two three! I go to <a href="http://yahoo.com" rel="nofollow noreferrer noopener" target="_blank">http://yahoo.com</a> and search for <em>sports</em> and <strong>answers</strong>.
Here is an iframe
expected := `<p>Test one two three! I go to <a href="http://yahoo.com" rel="nofollow noreferrer noopener" target="_blank">http://yahoo.com</a> and search for <em>sports</em> and <strong>answers</strong>.
Here is an iframe</p>
blah blah blah
<a href="http://owncast.online" rel="nofollow noreferrer noopener" target="_blank">test link</a>
<img class="emoji" src="/img/emoji/bananadance.gif">`
<p><a href="http://owncast.online" rel="nofollow noreferrer noopener" target="_blank">test link</a>
<img class="emoji" src="/img/emoji/bananadance.gif"></p>`
result := events.RenderAndSanitize(messageContent)
if result != expected {
@ -34,7 +31,7 @@ blah blah blah @@ -34,7 +31,7 @@ blah blah blah
// Test to make sure we block remote images in chat messages.
func TestBlockRemoteImages(t *testing.T) {
messageContent := `<img src="https://via.placeholder.com/img/emoji/350x150"> test ![](https://via.placeholder.com/img/emoji/350x150)`
expected := `test`
expected := `<p> test </p>`
result := events.RenderAndSanitize(messageContent)
if result != expected {
@ -45,7 +42,7 @@ func TestBlockRemoteImages(t *testing.T) { @@ -45,7 +42,7 @@ func TestBlockRemoteImages(t *testing.T) {
// Test to make sure emoji images are allowed in chat messages.
func TestAllowEmojiImages(t *testing.T) {
messageContent := `<img alt=":beerparrot:" title=":beerparrot:" src="/img/emoji/beerparrot.gif"> test ![](/img/emoji/beerparrot.gif)`
expected := `<img alt=":beerparrot:" title=":beerparrot:" src="/img/emoji/beerparrot.gif"> test <img src="/img/emoji/beerparrot.gif">`
expected := `<p><img alt=":beerparrot:" title=":beerparrot:" src="/img/emoji/beerparrot.gif"> test <img src="/img/emoji/beerparrot.gif"></p>`
result := events.RenderAndSanitize(messageContent)
if result != expected {

3
core/chat/persistence.go

@ -8,6 +8,7 @@ import ( @@ -8,6 +8,7 @@ import (
"github.com/owncast/owncast/core/chat/events"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/core/user"
"github.com/owncast/owncast/models"
log "github.com/sirupsen/logrus"
)
@ -103,7 +104,7 @@ func makeUserMessageEventFromRowData(row rowData) events.UserMessageEvent { @@ -103,7 +104,7 @@ func makeUserMessageEventFromRowData(row rowData) events.UserMessageEvent {
isBot := (row.userType != nil && *row.userType == "API")
scopeSlice := strings.Split(scopes, ",")
u := models.User{
u := user.User{
ID: *row.userID,
DisplayName: displayName,
DisplayColor: displayColor,

80
core/chat/server.go

@ -14,18 +14,14 @@ import ( @@ -14,18 +14,14 @@ import (
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/chat/events"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/core/user"
"github.com/owncast/owncast/core/webhooks"
"github.com/owncast/owncast/geoip"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/storage"
"github.com/owncast/owncast/utils"
)
var _server *Server
// a map of user IDs and when they last were active.
var _lastSeenCache = map[string]time.Time{}
// Server represents an instance of the chat server.
type Server struct {
clients map[uint]*Client
@ -39,7 +35,10 @@ type Server struct { @@ -39,7 +35,10 @@ type Server struct {
// unregister requests from clients.
unregister chan uint // the ChatClient id
geoipClient *geoip.Client
geoipClient *geoip.Client
// a map of user IDs and timers that fire for chat part messages.
userPartedTimers map[string]*time.Ticker
seq uint
maxSocketConnectionLimit int64
@ -58,6 +57,7 @@ func NewChat() *Server { @@ -58,6 +57,7 @@ func NewChat() *Server {
unregister: make(chan uint),
maxSocketConnectionLimit: maximumConcurrentConnectionLimit,
geoipClient: geoip.NewClient(),
userPartedTimers: map[string]*time.Ticker{},
}
return server
@ -68,7 +68,8 @@ func (s *Server) Run() { @@ -68,7 +68,8 @@ func (s *Server) Run() {
for {
select {
case clientID := <-s.unregister:
if _, ok := s.clients[clientID]; ok {
if client, ok := s.clients[clientID]; ok {
s.handleClientDisconnected(client)
s.mu.Lock()
delete(s.clients, clientID)
s.mu.Unlock()
@ -81,7 +82,7 @@ func (s *Server) Run() { @@ -81,7 +82,7 @@ func (s *Server) Run() {
}
// Addclient registers new connection as a User.
func (s *Server) Addclient(conn *websocket.Conn, user *models.User, accessToken string, userAgent string, ipAddress string) *Client {
func (s *Server) Addclient(conn *websocket.Conn, user *user.User, accessToken string, userAgent string, ipAddress string) *Client {
client := &Client{
server: s,
conn: conn,
@ -93,18 +94,22 @@ func (s *Server) Addclient(conn *websocket.Conn, user *models.User, accessToken @@ -93,18 +94,22 @@ func (s *Server) Addclient(conn *websocket.Conn, user *models.User, accessToken
ConnectedAt: time.Now(),
}
// Do not send user re-joined broadcast message if they've been active within 10 minutes.
shouldSendJoinedMessages := data.GetChatJoinMessagesEnabled()
if previouslyLastSeen, ok := _lastSeenCache[user.ID]; ok && time.Since(previouslyLastSeen) < time.Minute*10 {
shouldSendJoinedMessages = false
}
shouldSendJoinedMessages := data.GetChatJoinPartMessagesEnabled()
s.mu.Lock()
{
// If there is a pending disconnect timer then clear it.
// Do not send user joined message if enough time hasn't passed where the
// user chat part message hasn't been sent yet.
if ticker, ok := s.userPartedTimers[user.ID]; ok {
ticker.Stop()
delete(s.userPartedTimers, user.ID)
shouldSendJoinedMessages = false
}
client.Id = s.seq
s.clients[client.Id] = client
s.seq++
_lastSeenCache[user.ID] = time.Now()
}
s.mu.Unlock()
@ -144,16 +149,43 @@ func (s *Server) sendUserJoinedMessage(c *Client) { @@ -144,16 +149,43 @@ func (s *Server) sendUserJoinedMessage(c *Client) {
webhooks.SendChatEventUserJoined(userJoinedEvent)
}
// ClientClosed is fired when a client disconnects or connection is dropped.
func (s *Server) ClientClosed(c *Client) {
s.mu.Lock()
defer s.mu.Unlock()
c.close()
func (s *Server) handleClientDisconnected(c *Client) {
if _, ok := s.clients[c.Id]; ok {
log.Debugln("Deleting", c.Id)
delete(s.clients, c.Id)
}
additionalClientCheck, _ := GetClientsForUser(c.User.ID)
if len(additionalClientCheck) > 0 {
// This user is still connected to chat with another client.
return
}
s.userPartedTimers[c.User.ID] = time.NewTicker(10 * time.Second)
go func() {
<-s.userPartedTimers[c.User.ID].C
s.sendUserPartedMessage(c)
}()
}
func (s *Server) sendUserPartedMessage(c *Client) {
s.userPartedTimers[c.User.ID].Stop()
delete(s.userPartedTimers, c.User.ID)
userPartEvent := events.UserPartEvent{}
userPartEvent.SetDefaults()
userPartEvent.User = c.User
userPartEvent.ClientID = c.Id
// If part messages are disabled.
if data.GetChatJoinPartMessagesEnabled() {
if err := s.Broadcast(userPartEvent.GetBroadcastPayload()); err != nil {
log.Errorln("error sending chat part message", err)
}
}
// Send chat user joined webhook
webhooks.SendChatEventUserParted(userPartEvent)
}
// HandleClientConnection is fired when a single client connects to the websocket.
@ -200,10 +232,8 @@ func (s *Server) HandleClientConnection(w http.ResponseWriter, r *http.Request) @@ -200,10 +232,8 @@ func (s *Server) HandleClientConnection(w http.ResponseWriter, r *http.Request)
return
}
userRepository := storage.GetUserRepository()
// A user is required to use the websocket
user := userRepository.GetUserByToken(accessToken)
user := user.GetUserByToken(accessToken)
if user == nil {
// Send error that registration is required
_ = conn.WriteJSON(events.EventPayload{
@ -298,10 +328,8 @@ func SendConnectedClientInfoToUser(userID string) error { @@ -298,10 +328,8 @@ func SendConnectedClientInfoToUser(userID string) error {
return err
}
userRepository := storage.GetUserRepository()
// Get an updated reference to the user.
user := userRepository.GetUserByID(userID)
user := user.GetUserByID(userID)
if user == nil {
return fmt.Errorf("user not found")
}

3
core/core.go

@ -13,6 +13,7 @@ import ( @@ -13,6 +13,7 @@ import (
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/core/rtmp"
"github.com/owncast/owncast/core/transcoder"
"github.com/owncast/owncast/core/user"
"github.com/owncast/owncast/core/webhooks"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/notifications"
@ -55,7 +56,7 @@ func Start() error { @@ -55,7 +56,7 @@ func Start() error {
log.Errorln("storage error", err)
}
// user.SetupUsers()
user.SetupUsers()
auth.Setup(data.GetDatastore())
fileWriter.SetupFileWriterReceiverService(&handler)

111
core/data/config.go

@ -16,53 +16,54 @@ import ( @@ -16,53 +16,54 @@ import (
)
const (
extraContentKey = "extra_page_content"
streamTitleKey = "stream_title"
adminPasswordKey = "admin_password_key"
logoPathKey = "logo_path"
logoUniquenessKey = "logo_uniqueness"
serverSummaryKey = "server_summary"
serverWelcomeMessageKey = "server_welcome_message"
serverNameKey = "server_name"
serverURLKey = "server_url"
httpPortNumberKey = "http_port_number"
httpListenAddressKey = "http_listen_address"
websocketHostOverrideKey = "websocket_host_override"
rtmpPortNumberKey = "rtmp_port_number"
serverMetadataTagsKey = "server_metadata_tags"
directoryEnabledKey = "directory_enabled"
directoryRegistrationKeyKey = "directory_registration_key"
socialHandlesKey = "social_handles"
peakViewersSessionKey = "peak_viewers_session"
peakViewersOverallKey = "peak_viewers_overall"
lastDisconnectTimeKey = "last_disconnect_time"
ffmpegPathKey = "ffmpeg_path"
nsfwKey = "nsfw"
s3StorageConfigKey = "s3_storage_config"
videoLatencyLevel = "video_latency_level"
videoStreamOutputVariantsKey = "video_stream_output_variants"
chatDisabledKey = "chat_disabled"
externalActionsKey = "external_actions"
customStylesKey = "custom_styles"
customJavascriptKey = "custom_javascript"
videoCodecKey = "video_codec"
blockedUsernamesKey = "blocked_usernames"
publicKeyKey = "public_key"
privateKeyKey = "private_key"
serverInitDateKey = "server_init_date"
federationEnabledKey = "federation_enabled"
federationUsernameKey = "federation_username"
federationPrivateKey = "federation_private"
federationGoLiveMessageKey = "federation_go_live_message"
federationShowEngagementKey = "federation_show_engagement"
federationBlockedDomainsKey = "federation_blocked_domains"
suggestedUsernamesKey = "suggested_usernames"
chatJoinMessagesEnabledKey = "chat_join_messages_enabled"
chatEstablishedUsersOnlyModeKey = "chat_established_users_only_mode"
notificationsEnabledKey = "notifications_enabled"
discordConfigurationKey = "discord_configuration"
browserPushConfigurationKey = "browser_push_configuration"
browserPushPublicKeyKey = "browser_push_public_key"
extraContentKey = "extra_page_content"
streamTitleKey = "stream_title"
adminPasswordKey = "admin_password_key"
logoPathKey = "logo_path"
logoUniquenessKey = "logo_uniqueness"
serverSummaryKey = "server_summary"
serverWelcomeMessageKey = "server_welcome_message"
serverNameKey = "server_name"
serverURLKey = "server_url"
httpPortNumberKey = "http_port_number"
httpListenAddressKey = "http_listen_address"
websocketHostOverrideKey = "websocket_host_override"
rtmpPortNumberKey = "rtmp_port_number"
serverMetadataTagsKey = "server_metadata_tags"
directoryEnabledKey = "directory_enabled"
directoryRegistrationKeyKey = "directory_registration_key"
socialHandlesKey = "social_handles"
peakViewersSessionKey = "peak_viewers_session"
peakViewersOverallKey = "peak_viewers_overall"
lastDisconnectTimeKey = "last_disconnect_time"
ffmpegPathKey = "ffmpeg_path"
nsfwKey = "nsfw"
s3StorageConfigKey = "s3_storage_config"
videoLatencyLevel = "video_latency_level"
videoStreamOutputVariantsKey = "video_stream_output_variants"
chatDisabledKey = "chat_disabled"
externalActionsKey = "external_actions"
customStylesKey = "custom_styles"
customJavascriptKey = "custom_javascript"
videoCodecKey = "video_codec"
blockedUsernamesKey = "blocked_usernames"
publicKeyKey = "public_key"
privateKeyKey = "private_key"
serverInitDateKey = "server_init_date"
federationEnabledKey = "federation_enabled"
federationUsernameKey = "federation_username"
federationPrivateKey = "federation_private"
federationGoLiveMessageKey = "federation_go_live_message"
federationShowEngagementKey = "federation_show_engagement"
federationBlockedDomainsKey = "federation_blocked_domains"
suggestedUsernamesKey = "suggested_usernames"
chatJoinMessagesEnabledKey = "chat_join_messages_enabled"
chatEstablishedUsersOnlyModeKey = "chat_established_users_only_mode"
notificationsEnabledKey = "notifications_enabled"
discordConfigurationKey = "discord_configuration"
browserPushConfigurationKey = "browser_push_configuration"
browserPushPublicKeyKey = "browser_push_public_key"
// nolint:gosec
browserPushPrivateKeyKey = "browser_push_private_key"
hasConfiguredInitialNotificationsKey = "has_configured_initial_notifications"
hideViewerCountKey = "hide_viewer_count"
@ -619,19 +620,19 @@ func VerifySettings() error { @@ -619,19 +620,19 @@ func VerifySettings() error {
}
// FindHighestVideoQualityIndex will return the highest quality from a slice of variants.
func FindHighestVideoQualityIndex(qualities []models.StreamOutputVariant) int {
func FindHighestVideoQualityIndex(qualities []models.StreamOutputVariant) (int, bool) {
type IndexedQuality struct {
index int
quality models.StreamOutputVariant
index int
}
if len(qualities) < 2 {
return 0
return 0, qualities[0].IsVideoPassthrough
}
indexedQualities := make([]IndexedQuality, 0)
for index, quality := range qualities {
indexedQuality := IndexedQuality{index, quality}
indexedQuality := IndexedQuality{quality, index}
indexedQualities = append(indexedQualities, indexedQuality)
}
@ -647,7 +648,9 @@ func FindHighestVideoQualityIndex(qualities []models.StreamOutputVariant) int { @@ -647,7 +648,9 @@ func FindHighestVideoQualityIndex(qualities []models.StreamOutputVariant) int {
return indexedQualities[a].quality.VideoBitrate > indexedQualities[b].quality.VideoBitrate
})
return indexedQualities[0].index
// nolint:gosec
selectedQuality := indexedQualities[0]
return selectedQuality.index, selectedQuality.quality.IsVideoPassthrough
}
// GetForbiddenUsernameList will return the blocked usernames as a comma separated string.
@ -814,8 +817,8 @@ func SetChatJoinMessagesEnabled(enabled bool) error { @@ -814,8 +817,8 @@ func SetChatJoinMessagesEnabled(enabled bool) error {
return _datastore.SetBool(chatJoinMessagesEnabledKey, enabled)
}
// GetChatJoinMessagesEnabled will return if chat join messages are enabled.
func GetChatJoinMessagesEnabled() bool {
// GetChatJoinPartMessagesEnabled will return if chat join messages are enabled.
func GetChatJoinPartMessagesEnabled() bool {
enabled, err := _datastore.GetBool(chatJoinMessagesEnabledKey)
if err != nil {
return true

2
core/data/configEntry.go

@ -8,8 +8,8 @@ import ( @@ -8,8 +8,8 @@ import (
// ConfigEntry is the actual object saved to the database.
// The Value is encoded using encoding/gob.
type ConfigEntry struct {
Key string
Value interface{}
Key string
}
func (c *ConfigEntry) getStringSlice() ([]string, error) {

6
core/data/data_test.go

@ -20,6 +20,8 @@ func TestString(t *testing.T) { @@ -20,6 +20,8 @@ func TestString(t *testing.T) {
const testKey = "test string key"
const testValue = "test string value"
fmt.Println(testKey, testValue)
if err := _datastore.SetString(testKey, testValue); err != nil {
panic(err)
}
@ -87,7 +89,7 @@ func TestCustomType(t *testing.T) { @@ -87,7 +89,7 @@ func TestCustomType(t *testing.T) {
}
// Save config entry to the database
if err := _datastore.Save(ConfigEntry{testKey, &testStruct}); err != nil {
if err := _datastore.Save(ConfigEntry{&testStruct, testKey}); err != nil {
t.Error(err)
}
@ -119,7 +121,7 @@ func TestStringMap(t *testing.T) { @@ -119,7 +121,7 @@ func TestStringMap(t *testing.T) {
}
// Save config entry to the database
if err := _datastore.Save(ConfigEntry{testKey, &testMap}); err != nil {
if err := _datastore.Save(ConfigEntry{&testMap, testKey}); err != nil {
t.Error(err)
}

84
core/data/emoji.go

@ -6,6 +6,8 @@ import ( @@ -6,6 +6,8 @@ import (
"io/fs"
"os"
"path/filepath"
"sync"
"time"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/models"
@ -15,29 +17,81 @@ import ( @@ -15,29 +17,81 @@ import (
log "github.com/sirupsen/logrus"
)
// GetEmojiList returns a list of custom emoji from the emoji directory.
func GetEmojiList() []models.CustomEmoji {
emojiFS := os.DirFS(config.CustomEmojiPath)
var (
emojiCacheMu sync.Mutex
emojiCacheData = make([]models.CustomEmoji, 0)
emojiCacheModTime time.Time
)
emojiResponse := make([]models.CustomEmoji, 0)
// UpdateEmojiList will update the cache (if required) and
// return the modifiation time.
func UpdateEmojiList(force bool) (time.Time, error) {
var modTime time.Time
walkFunction := func(path string, d os.DirEntry, err error) error {
if d.IsDir() {
return nil
emojiPathInfo, err := os.Stat(config.CustomEmojiPath)
if err != nil {
return modTime, err
}
modTime = emojiPathInfo.ModTime()
if modTime.After(emojiCacheModTime) || force {
emojiCacheMu.Lock()
defer emojiCacheMu.Unlock()
// double-check that another thread didn't update this while waiting.
if modTime.After(emojiCacheModTime) || force {
emojiCacheModTime = modTime
if force {
emojiCacheModTime = time.Now()
}
emojiFS := os.DirFS(config.CustomEmojiPath)
if emojiFS == nil {
return modTime, fmt.Errorf("unable to open custom emoji directory")
}
emojiCacheData = make([]models.CustomEmoji, 0)
walkFunction := func(path string, d os.DirEntry, err error) error {
if d == nil || d.IsDir() {
return nil
}
emojiPath := filepath.Join(config.EmojiDir, path)
fileName := d.Name()
fileBase := fileName[:len(fileName)-len(filepath.Ext(fileName))]
singleEmoji := models.CustomEmoji{Name: fileBase, URL: emojiPath}
emojiCacheData = append(emojiCacheData, singleEmoji)
return nil
}
if err := fs.WalkDir(emojiFS, ".", walkFunction); err != nil {
log.Errorln("unable to fetch emojis: " + err.Error())
}
}
}
return modTime, nil
}
emojiPath := filepath.Join(config.EmojiDir, path)
singleEmoji := models.CustomEmoji{Name: d.Name(), URL: emojiPath}
emojiResponse = append(emojiResponse, singleEmoji)
// GetEmojiList returns a list of custom emoji from the emoji directory.
func GetEmojiList() []models.CustomEmoji {
_, err := UpdateEmojiList(false)
if err != nil {
return nil
}
if err := fs.WalkDir(emojiFS, ".", walkFunction); err != nil {
log.Errorln("unable to fetch emojis: " + err.Error())
return emojiResponse
}
// Lock to make sure this doesn't get updated in the middle of reading
emojiCacheMu.Lock()
defer emojiCacheMu.Unlock()
// return a copy of cache data, ensures underlying slice isn't affected
// by future update
emojiData := make([]models.CustomEmoji, len(emojiCacheData))
copy(emojiData, emojiCacheData)
return emojiResponse
return emojiData
}
// SetupEmojiDirectory sets up the custom emoji directory by copying all built-in

10
core/data/types.go

@ -11,7 +11,7 @@ func (ds *Datastore) GetStringSlice(key string) ([]string, error) { @@ -11,7 +11,7 @@ func (ds *Datastore) GetStringSlice(key string) ([]string, error) {
// SetStringSlice will set the string slice value for a key.
func (ds *Datastore) SetStringSlice(key string, value []string) error {
configEntry := ConfigEntry{key, value}
configEntry := ConfigEntry{value, key}
return ds.Save(configEntry)
}
@ -26,7 +26,7 @@ func (ds *Datastore) GetString(key string) (string, error) { @@ -26,7 +26,7 @@ func (ds *Datastore) GetString(key string) (string, error) {
// SetString will set the string value for a key.
func (ds *Datastore) SetString(key string, value string) error {
configEntry := ConfigEntry{key, value}
configEntry := ConfigEntry{value, key}
return ds.Save(configEntry)
}
@ -41,7 +41,7 @@ func (ds *Datastore) GetNumber(key string) (float64, error) { @@ -41,7 +41,7 @@ func (ds *Datastore) GetNumber(key string) (float64, error) {
// SetNumber will set the numeric value for a key.
func (ds *Datastore) SetNumber(key string, value float64) error {
configEntry := ConfigEntry{key, value}
configEntry := ConfigEntry{value, key}
return ds.Save(configEntry)
}
@ -56,7 +56,7 @@ func (ds *Datastore) GetBool(key string) (bool, error) { @@ -56,7 +56,7 @@ func (ds *Datastore) GetBool(key string) (bool, error) {
// SetBool will set the boolean value for a key.
func (ds *Datastore) SetBool(key string, value bool) error {
configEntry := ConfigEntry{key, value}
configEntry := ConfigEntry{value, key}
return ds.Save(configEntry)
}
@ -71,6 +71,6 @@ func (ds *Datastore) GetStringMap(key string) (map[string]string, error) { @@ -71,6 +71,6 @@ func (ds *Datastore) GetStringMap(key string) (map[string]string, error) {
// SetStringMap will set the string map value for a key.
func (ds *Datastore) SetStringMap(key string, value map[string]string) error {
configEntry := ConfigEntry{key, value}
configEntry := ConfigEntry{value, key}
return ds.Save(configEntry)
}

6
core/rtmp/rtmp.go

@ -73,7 +73,7 @@ func HandleConn(c *rtmp.Conn, nc net.Conn) { @@ -73,7 +73,7 @@ func HandleConn(c *rtmp.Conn, nc net.Conn) {
}
if _hasInboundRTMPConnection {
log.Errorln("stream already running; can not overtake an existing stream")
log.Errorln("stream already running; can not overtake an existing stream from", nc.RemoteAddr().String())
_ = nc.Close()
return
}
@ -94,14 +94,14 @@ func HandleConn(c *rtmp.Conn, nc net.Conn) { @@ -94,14 +94,14 @@ func HandleConn(c *rtmp.Conn, nc net.Conn) {
}
if !accessGranted {
log.Errorln("invalid streaming key; rejecting incoming stream")
log.Errorln("invalid streaming key; rejecting incoming stream from", nc.RemoteAddr().String())
_ = nc.Close()
return
}
rtmpOut, rtmpIn := io.Pipe()
_pipe = rtmpIn
log.Infoln("Inbound stream connected.")
log.Infoln("Inbound stream connected from", nc.RemoteAddr().String())
_setStreamAsConnected(rtmpOut)
_hasInboundRTMPConnection = true

16
core/storageproviders/local.go

@ -13,7 +13,9 @@ import ( @@ -13,7 +13,9 @@ import (
)
// LocalStorage represents an instance of the local storage provider for HLS video.
type LocalStorage struct{}
type LocalStorage struct {
host string
}
// NewLocalStorage returns a new LocalStorage instance.
func NewLocalStorage() *LocalStorage {
@ -22,6 +24,7 @@ func NewLocalStorage() *LocalStorage { @@ -22,6 +24,7 @@ func NewLocalStorage() *LocalStorage {
// Setup configures this storage provider.
func (s *LocalStorage) Setup() error {
s.host = data.GetVideoServingEndpoint()
return nil
}
@ -42,8 +45,15 @@ func (s *LocalStorage) VariantPlaylistWritten(localFilePath string) { @@ -42,8 +45,15 @@ func (s *LocalStorage) VariantPlaylistWritten(localFilePath string) {
// MasterPlaylistWritten is called when the master hls playlist is written.
func (s *LocalStorage) MasterPlaylistWritten(localFilePath string) {
if _, err := s.Save(localFilePath, 0); err != nil {
log.Warnln(err)
// If we're using a remote serving endpoint, we need to rewrite the master playlist
if s.host != "" {
if err := rewritePlaylistLocations(localFilePath, s.host, ""); err != nil {
log.Warnln(err)
}
} else {
if _, err := s.Save(localFilePath, 0); err != nil {
log.Warnln(err)
}
}
}

13
core/storageproviders/rewriteLocalPlaylist.go

@ -12,8 +12,8 @@ import ( @@ -12,8 +12,8 @@ import (
log "github.com/sirupsen/logrus"
)
// rewriteRemotePlaylist will take a local playlist and rewrite it to have absolute URLs to remote locations.
func rewriteRemotePlaylist(localFilePath, remoteServingEndpoint string) error {
// rewritePlaylistLocations will take a local playlist and rewrite it to have absolute URLs to a specified location.
func rewritePlaylistLocations(localFilePath, remoteServingEndpoint, pathPrefix string) error {
f, err := os.Open(localFilePath) // nolint
if err != nil {
log.Fatalln(err)
@ -25,7 +25,14 @@ func rewriteRemotePlaylist(localFilePath, remoteServingEndpoint string) error { @@ -25,7 +25,14 @@ func rewriteRemotePlaylist(localFilePath, remoteServingEndpoint string) error {
}
for _, item := range p.Variants {
item.URI = remoteServingEndpoint + filepath.Join("/hls", item.URI)
// Determine the final path to this playlist.
var finalPath string
if pathPrefix != "" {
finalPath = filepath.Join(pathPrefix, "/hls")
} else {
finalPath = "/hls"
}
item.URI = remoteServingEndpoint + filepath.Join(finalPath, item.URI)
}
publicPath := filepath.Join(config.HLSStoragePath, filepath.Base(localFilePath))

66
core/storageproviders/s3Storage.go

@ -8,6 +8,7 @@ import ( @@ -8,6 +8,7 @@ import (
"path/filepath"
"sort"
"strings"
"sync"
"time"
"github.com/owncast/owncast/core/data"
@ -26,30 +27,37 @@ import ( @@ -26,30 +27,37 @@ import (
// S3Storage is the s3 implementation of a storage provider.
type S3Storage struct {
sess *session.Session
// If we try to upload a playlist but it is not yet on disk
// then keep a reference to it here.
queuedPlaylistUpdates map[string]string
s3Client *s3.S3
host string
s3Endpoint string
s3ServingEndpoint string
s3Region string
uploader *s3manager.Uploader
sess *session.Session
s3Secret string
s3Bucket string
s3Region string
s3ServingEndpoint string
s3AccessKey string
s3Secret string
s3ACL string
s3ForcePathStyle bool
s3PathPrefix string
// If we try to upload a playlist but it is not yet on disk
// then keep a reference to it here.
queuedPlaylistUpdates map[string]string
s3Endpoint string
host string
uploader *s3manager.Uploader
lock sync.Mutex
s3ForcePathStyle bool
}
// NewS3Storage returns a new S3Storage instance.
func NewS3Storage() *S3Storage {
return &S3Storage{
queuedPlaylistUpdates: make(map[string]string),
lock: sync.Mutex{},
}
}
@ -73,6 +81,7 @@ func (s *S3Storage) Setup() error { @@ -73,6 +81,7 @@ func (s *S3Storage) Setup() error {
s.s3AccessKey = s3Config.AccessKey
s.s3Secret = s3Config.Secret
s.s3ACL = s3Config.ACL
s.s3PathPrefix = s3Config.PathPrefix
s.s3ForcePathStyle = s3Config.ForcePathStyle
s.sess = s.connectAWS()
@ -107,6 +116,7 @@ func (s *S3Storage) SegmentWritten(localFilePath string) { @@ -107,6 +116,7 @@ func (s *S3Storage) SegmentWritten(localFilePath string) {
// so the segments and the HLS playlist referencing
// them are in sync.
playlistPath := filepath.Join(filepath.Dir(localFilePath), "stream.m3u8")
if _, err := s.Save(playlistPath, 0); err != nil {
s.queuedPlaylistUpdates[playlistPath] = playlistPath
if pErr, ok := err.(*os.PathError); ok {
@ -121,6 +131,8 @@ func (s *S3Storage) VariantPlaylistWritten(localFilePath string) { @@ -121,6 +131,8 @@ func (s *S3Storage) VariantPlaylistWritten(localFilePath string) {
// We are uploading the variant playlist after uploading the segment
// to make sure we're not referring to files in a playlist that don't
// yet exist. See SegmentWritten.
s.lock.Lock()
defer s.lock.Unlock()
if _, ok := s.queuedPlaylistUpdates[localFilePath]; ok {
if _, err := s.Save(localFilePath, 0); err != nil {
log.Errorln(err)
@ -133,7 +145,7 @@ func (s *S3Storage) VariantPlaylistWritten(localFilePath string) { @@ -133,7 +145,7 @@ func (s *S3Storage) VariantPlaylistWritten(localFilePath string) {
// MasterPlaylistWritten is called when the master hls playlist is written.
func (s *S3Storage) MasterPlaylistWritten(localFilePath string) {
// Rewrite the playlist to use absolute remote S3 URLs
if err := rewriteRemotePlaylist(localFilePath, s.host); err != nil {
if err := rewritePlaylistLocations(localFilePath, s.host, s.s3PathPrefix); err != nil {
log.Warnln(err)
}
}
@ -151,6 +163,12 @@ func (s *S3Storage) Save(filePath string, retryCount int) (string, error) { @@ -151,6 +163,12 @@ func (s *S3Storage) Save(filePath string, retryCount int) (string, error) {
// Build the remote path by adding the "hls" path prefix.
remotePath := strings.Join([]string{"hls", normalizedPath}, "")
// If a custom path prefix is set prepend it.
if s.s3PathPrefix != "" {
prefix := strings.TrimPrefix(s.s3PathPrefix, "/")
remotePath = strings.Join([]string{prefix, remotePath}, "/")
}
maxAgeSeconds := utils.GetCacheDurationSecondsForPath(filePath)
cacheControlHeader := fmt.Sprintf("max-age=%d", maxAgeSeconds)
@ -184,9 +202,15 @@ func (s *S3Storage) Save(filePath string, retryCount int) (string, error) { @@ -184,9 +202,15 @@ func (s *S3Storage) Save(filePath string, retryCount int) (string, error) {
return s.Save(filePath, retryCount+1)
}
// Upload failure. Remove the local file.
s.removeLocalFile(filePath)
return "", fmt.Errorf("Giving up uploading %s to object storage %s", filePath, s.s3Endpoint)
}
// Upload success. Remove the local file.
s.removeLocalFile(filePath)
return response.Location, nil
}
@ -200,7 +224,9 @@ func (s *S3Storage) Cleanup() error { @@ -200,7 +224,9 @@ func (s *S3Storage) Cleanup() error {
return err
}
s.deleteObjects(keys)
if len(keys) > 0 {
s.deleteObjects(keys)
}
return nil
}
@ -241,11 +267,23 @@ func (s *S3Storage) getDeletableVideoSegmentsWithOffset(offset int) ([]s3object, @@ -241,11 +267,23 @@ func (s *S3Storage) getDeletableVideoSegmentsWithOffset(offset int) ([]s3object,
return nil, err
}
if offset > len(objectsToDelete)-1 {
offset = len(objectsToDelete) - 1
}
objectsToDelete = objectsToDelete[offset : len(objectsToDelete)-1]
return objectsToDelete, nil
}
func (s *S3Storage) removeLocalFile(filePath string) {
cleanFilepath := filepath.Clean(filePath)
if err := os.Remove(cleanFilepath); err != nil {
log.Errorln(err)
}
}
func (s *S3Storage) deleteObjects(objects []s3object) {
keys := make([]*s3.ObjectIdentifier, len(objects))
for i, object := range objects {
@ -301,6 +339,6 @@ func (s *S3Storage) retrieveAllVideoSegments() ([]s3object, error) { @@ -301,6 +339,6 @@ func (s *S3Storage) retrieveAllVideoSegments() ([]s3object, error) {
}
type s3object struct {
key string
lastModified time.Time
key string
}

3
core/streamState.go

@ -69,7 +69,8 @@ func setStreamAsConnected(rtmpOut *io.PipeReader) { @@ -69,7 +69,8 @@ func setStreamAsConnected(rtmpOut *io.PipeReader) {
}()
go webhooks.SendStreamStatusEvent(models.StreamStarted)
transcoder.StartThumbnailGenerator(segmentPath, data.FindHighestVideoQualityIndex(_currentBroadcast.OutputSettings))
selectedThumbnailVideoQualityIndex, isVideoPassthrough := data.FindHighestVideoQualityIndex(_currentBroadcast.OutputSettings)
transcoder.StartThumbnailGenerator(segmentPath, selectedThumbnailVideoQualityIndex, isVideoPassthrough)
_ = chat.SendSystemAction("Stay tuned, the stream is **starting**!", true)
chat.SendAllWelcomeMessage()

8
core/transcoder/thumbnailGenerator.go

@ -25,7 +25,7 @@ func StopThumbnailGenerator() { @@ -25,7 +25,7 @@ func StopThumbnailGenerator() {
}
// StartThumbnailGenerator starts generating thumbnails.
func StartThumbnailGenerator(chunkPath string, variantIndex int) {
func StartThumbnailGenerator(chunkPath string, variantIndex int, isVideoPassthrough bool) {
// Every 20 seconds create a thumbnail from the most
// recent video segment.
_timer = time.NewTicker(20 * time.Second)
@ -36,7 +36,11 @@ func StartThumbnailGenerator(chunkPath string, variantIndex int) { @@ -36,7 +36,11 @@ func StartThumbnailGenerator(chunkPath string, variantIndex int) {
select {
case <-_timer.C:
if err := fireThumbnailGenerator(chunkPath, variantIndex); err != nil {
log.Errorln("Unable to generate thumbnail:", err)
logMsg := "Unable to generate thumbnail: " + err.Error()
if isVideoPassthrough {
logMsg += ". Video Passthrough is enabled. You should disable it to fix this, and other, streaming errors. https://owncast.online/troubleshoot"
}
log.Errorln("Unable to generate thumbnail:", logMsg)
}
case <-quit:
log.Debug("thumbnail generator has stopped")

10
core/transcoder/utils.go

@ -13,8 +13,10 @@ import ( @@ -13,8 +13,10 @@ import (
log "github.com/sirupsen/logrus"
)
var _lastTranscoderLogMessage = ""
var l = &sync.RWMutex{}
var (
_lastTranscoderLogMessage = ""
l = &sync.RWMutex{}
)
var errorMap = map[string]string{
"Unrecognized option 'vaapi_device'": "you are likely trying to utilize a vaapi codec, but your version of ffmpeg or your hardware doesn't support it. change your codec to libx264 and restart your stream",
@ -100,14 +102,14 @@ func createVariantDirectories() { @@ -100,14 +102,14 @@ func createVariantDirectories() {
if len(data.GetStreamOutputVariants()) != 0 {
for index := range data.GetStreamOutputVariants() {
if err := os.MkdirAll(path.Join(config.HLSStoragePath, strconv.Itoa(index)), 0750); err != nil {
if err := os.MkdirAll(path.Join(config.HLSStoragePath, strconv.Itoa(index)), 0o750); err != nil {
log.Fatalln(err)
}
}
} else {
dir := path.Join(config.HLSStoragePath, strconv.Itoa(0))
log.Traceln("Creating", dir)
if err := os.MkdirAll(dir, 0750); err != nil {
if err := os.MkdirAll(dir, 0o750); err != nil {
log.Fatalln(err)
}
}

311
core/user/externalAPIUser.go

@ -0,0 +1,311 @@ @@ -0,0 +1,311 @@
package user
import (
"context"
"database/sql"
"strings"
"time"
"github.com/owncast/owncast/utils"
"github.com/pkg/errors"
log "github.com/sirupsen/logrus"
"github.com/teris-io/shortid"
)
// ExternalAPIUser represents a single 3rd party integration that uses an access token.
// This struct mostly matches the User struct so they can be used interchangeably.
type ExternalAPIUser struct {
CreatedAt time.Time `json:"createdAt"`
LastUsedAt *time.Time `json:"lastUsedAt,omitempty"`
ID string `json:"id"`
AccessToken string `json:"accessToken"`
DisplayName string `json:"displayName"`
Type string `json:"type,omitempty"` // Should be API
Scopes []string `json:"scopes"`
DisplayColor int `json:"displayColor"`
IsBot bool `json:"isBot"`
}
const (
// ScopeCanSendChatMessages will allow sending chat messages as itself.
ScopeCanSendChatMessages = "CAN_SEND_MESSAGES"
// ScopeCanSendSystemMessages will allow sending chat messages as the system.
ScopeCanSendSystemMessages = "CAN_SEND_SYSTEM_MESSAGES"
// ScopeHasAdminAccess will allow performing administrative actions on the server.
ScopeHasAdminAccess = "HAS_ADMIN_ACCESS"
)
// For a scope to be seen as "valid" it must live in this slice.
var validAccessTokenScopes = []string{
ScopeCanSendChatMessages,
ScopeCanSendSystemMessages,
ScopeHasAdminAccess,
}
// InsertExternalAPIUser will add a new API user to the database.
func InsertExternalAPIUser(token string, name string, color int, scopes []string) error {
log.Traceln("Adding new API user")
_datastore.DbLock.Lock()
defer _datastore.DbLock.Unlock()
scopesString := strings.Join(scopes, ",")
id := shortid.MustGenerate()
tx, err := _datastore.DB.Begin()
if err != nil {
return err
}
stmt, err := tx.Prepare("INSERT INTO users(id, display_name, display_color, scopes, type, previous_names) values(?, ?, ?, ?, ?, ?)")
if err != nil {
return err
}
defer stmt.Close()
if _, err = stmt.Exec(id, name, color, scopesString, "API", name); err != nil {
return err
}
if err = tx.Commit(); err != nil {
return err
}
if err := addAccessTokenForUser(token, id); err != nil {
return errors.Wrap(err, "unable to save access token for new external api user")
}
return nil
}
// DeleteExternalAPIUser will delete a token from the database.
func DeleteExternalAPIUser(token string) error {
log.Traceln("Deleting access token")
_datastore.DbLock.Lock()
defer _datastore.DbLock.Unlock()
tx, err := _datastore.DB.Begin()
if err != nil {
return err
}
stmt, err := tx.Prepare("UPDATE users SET disabled_at = CURRENT_TIMESTAMP WHERE id = (SELECT user_id FROM user_access_tokens WHERE token = ?)")
if err != nil {
return err
}
defer stmt.Close()
result, err := stmt.Exec(token)
if err != nil {
return err
}
if rowsDeleted, _ := result.RowsAffected(); rowsDeleted == 0 {
tx.Rollback() //nolint
return errors.New(token + " not found")
}
if err = tx.Commit(); err != nil {
return err
}
return nil
}
// GetExternalAPIUserForAccessTokenAndScope will determine if a specific token has access to perform a scoped action.
func GetExternalAPIUserForAccessTokenAndScope(token string, scope string) (*ExternalAPIUser, error) {
// This will split the scopes from comma separated to individual rows
// so we can efficiently find if a token supports a single scope.
// This is SQLite specific, so if we ever support other database
// backends we need to support other methods.
query := `SELECT
id,
scopes,
display_name,
display_color,
created_at,
last_used
FROM
user_access_tokens
INNER JOIN (
WITH RECURSIVE split(
id,
scopes,
display_name,
display_color,
created_at,
last_used,
disabled_at,
scope,
rest
) AS (
SELECT
id,
scopes,
display_name,
display_color,
created_at,
last_used,
disabled_at,
'',
scopes || ','
FROM
users AS u
UNION ALL
SELECT
id,
scopes,
display_name,
display_color,
created_at,
last_used,
disabled_at,
substr(rest, 0, instr(rest, ',')),
substr(rest, instr(rest, ',') + 1)
FROM
split
WHERE
rest <> ''
)
SELECT
id,
display_name,
display_color,
created_at,
last_used,
disabled_at,
scopes,
scope
FROM
split
WHERE
scope <> ''
) ON user_access_tokens.user_id = id
WHERE
disabled_at IS NULL
AND token = ?
AND scope = ?;`
row := _datastore.DB.QueryRow(query, token, scope)
integration, err := makeExternalAPIUserFromRow(row)
return integration, err
}
// GetIntegrationNameForAccessToken will return the integration name associated with a specific access token.
func GetIntegrationNameForAccessToken(token string) *string {
name, err := _datastore.GetQueries().GetUserDisplayNameByToken(context.Background(), token)
if err != nil {
return nil
}
return &name
}
// GetExternalAPIUser will return all API users with access tokens.
func GetExternalAPIUser() ([]ExternalAPIUser, error) { //nolint
query := "SELECT id, token, display_name, display_color, scopes, created_at, last_used FROM users, user_access_tokens WHERE user_access_tokens.user_id = id AND type IS 'API' AND disabled_at IS NULL"
rows, err := _datastore.DB.Query(query)
if err != nil {
return []ExternalAPIUser{}, err
}
defer rows.Close()
integrations, err := makeExternalAPIUsersFromRows(rows)
return integrations, err
}
// SetExternalAPIUserAccessTokenAsUsed will update the last used timestamp for a token.
func SetExternalAPIUserAccessTokenAsUsed(token string) error {
tx, err := _datastore.DB.Begin()
if err != nil {
return err
}
stmt, err := tx.Prepare("UPDATE users SET last_used = CURRENT_TIMESTAMP WHERE id = (SELECT user_id FROM user_access_tokens WHERE token = ?)")
if err != nil {
return err
}
defer stmt.Close()
if _, err := stmt.Exec(token); err != nil {
return err
}
if err = tx.Commit(); err != nil {
return err
}
return nil
}
func makeExternalAPIUserFromRow(row *sql.Row) (*ExternalAPIUser, error) {
var id string
var displayName string
var displayColor int
var scopes string
var createdAt time.Time
var lastUsedAt *time.Time
err := row.Scan(&id, &scopes, &displayName, &displayColor, &createdAt, &lastUsedAt)
if err != nil {
log.Debugln("unable to convert row to api user", err)
return nil, err
}
integration := ExternalAPIUser{
ID: id,
DisplayName: displayName,
DisplayColor: displayColor,
CreatedAt: createdAt,
Scopes: strings.Split(scopes, ","),
LastUsedAt: lastUsedAt,
}
return &integration, nil
}
func makeExternalAPIUsersFromRows(rows *sql.Rows) ([]ExternalAPIUser, error) {
integrations := make([]ExternalAPIUser, 0)
for rows.Next() {
var id string
var accessToken string
var displayName string
var displayColor int
var scopes string
var createdAt time.Time
var lastUsedAt *time.Time
err := rows.Scan(&id, &accessToken, &displayName, &displayColor, &scopes, &createdAt, &lastUsedAt)
if err != nil {
log.Errorln(err)
return nil, err
}
integration := ExternalAPIUser{
ID: id,
AccessToken: accessToken,
DisplayName: displayName,
DisplayColor: displayColor,
CreatedAt: createdAt,
Scopes: strings.Split(scopes, ","),
LastUsedAt: lastUsedAt,
IsBot: true,
}
integrations = append(integrations, integration)
}
return integrations, nil
}
// HasValidScopes will verify that all the scopes provided are valid.
func HasValidScopes(scopes []string) bool {
for _, scope := range scopes {
_, foundInSlice := utils.FindInSlice(validAccessTokenScopes, scope)
if !foundInSlice {
return false
}
}
return true
}

25
storage/externalAPIUser_test.go → core/user/externalAPIUser_test.go

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
package storage
package user
import (
"testing"
@ -11,27 +11,24 @@ const ( @@ -11,27 +11,24 @@ const (
token = "test-token-123"
)
var (
testScopes = []string{"test-scope"}
userRepository UserRepository
)
var testScopes = []string{"test-scope"}
func TestMain(m *testing.M) {
if err := data.SetupPersistence(":memory:"); err != nil {
panic(err)
}
userRepository = NewUserRepository(data.GetDatastore())
SetupUsers()
m.Run()
}
func TestCreateExternalAPIUser(t *testing.T) {
if err := userRepository.InsertExternalAPIUser(token, tokenName, 0, testScopes); err != nil {
if err := InsertExternalAPIUser(token, tokenName, 0, testScopes); err != nil {
t.Fatal(err)
}
user := userRepository.GetUserByToken(token)
user := GetUserByToken(token)
if user == nil {
t.Fatal("api user not found after creating")
}
@ -46,13 +43,13 @@ func TestCreateExternalAPIUser(t *testing.T) { @@ -46,13 +43,13 @@ func TestCreateExternalAPIUser(t *testing.T) {
}
func TestDeleteExternalAPIUser(t *testing.T) {
if err := userRepository.DeleteExternalAPIUser(token); err != nil {
if err := DeleteExternalAPIUser(token); err != nil {
t.Fatal(err)
}
}
func TestVerifyTokenDisabled(t *testing.T) {
users, err := userRepository.GetExternalAPIUser()
users, err := GetExternalAPIUser()
if err != nil {
t.Fatal(err)
}
@ -63,7 +60,7 @@ func TestVerifyTokenDisabled(t *testing.T) { @@ -63,7 +60,7 @@ func TestVerifyTokenDisabled(t *testing.T) {
}
func TestVerifyGetUserTokenDisabled(t *testing.T) {
user := userRepository.GetUserByToken(token)
user := GetUserByToken(token)
if user == nil {
t.Fatal("user not returned in GetUserByToken after disabling")
}
@ -74,7 +71,7 @@ func TestVerifyGetUserTokenDisabled(t *testing.T) { @@ -74,7 +71,7 @@ func TestVerifyGetUserTokenDisabled(t *testing.T) {
}
func TestVerifyGetExternalAPIUserForAccessTokenAndScopeTokenDisabled(t *testing.T) {
user, _ := userRepository.GetExternalAPIUserForAccessTokenAndScope(token, testScopes[0])
user, _ := GetExternalAPIUserForAccessTokenAndScope(token, testScopes[0])
if user != nil {
t.Fatal("user returned in GetExternalAPIUserForAccessTokenAndScope after disabling")
@ -82,13 +79,13 @@ func TestVerifyGetExternalAPIUserForAccessTokenAndScopeTokenDisabled(t *testing. @@ -82,13 +79,13 @@ func TestVerifyGetExternalAPIUserForAccessTokenAndScopeTokenDisabled(t *testing.
}
func TestCreateAdditionalAPIUser(t *testing.T) {
if err := userRepository.InsertExternalAPIUser("ignore-me", "token-to-be-ignored", 0, testScopes); err != nil {
if err := InsertExternalAPIUser("ignore-me", "token-to-be-ignored", 0, testScopes); err != nil {
t.Fatal(err)
}
}
func TestAgainVerifyGetExternalAPIUserForAccessTokenAndScopeTokenDisabled(t *testing.T) {
user, _ := userRepository.GetExternalAPIUserForAccessTokenAndScope(token, testScopes[0])
user, _ := GetExternalAPIUserForAccessTokenAndScope(token, testScopes[0])
if user != nil {
t.Fatal("user returned in TestAgainVerifyGetExternalAPIUserForAccessTokenAndScopeTokenDisabled after disabling")

473
core/user/user.go

@ -0,0 +1,473 @@ @@ -0,0 +1,473 @@
package user
import (
"context"
"database/sql"
"fmt"
"sort"
"strings"
"time"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/db"
"github.com/owncast/owncast/utils"
"github.com/pkg/errors"
"github.com/teris-io/shortid"
log "github.com/sirupsen/logrus"
)
var _datastore *data.Datastore
const (
moderatorScopeKey = "MODERATOR"
minSuggestedUsernamePoolLength = 10
)
// User represents a single chat user.
type User struct {
CreatedAt time.Time `json:"createdAt"`
DisabledAt *time.Time `json:"disabledAt,omitempty"`
NameChangedAt *time.Time `json:"nameChangedAt,omitempty"`
AuthenticatedAt *time.Time `json:"-"`
ID string `json:"id"`
DisplayName string `json:"displayName"`
PreviousNames []string `json:"previousNames"`
Scopes []string `json:"scopes,omitempty"`
DisplayColor int `json:"displayColor"`
IsBot bool `json:"isBot"`
Authenticated bool `json:"authenticated"`
}
// IsEnabled will return if this single user is enabled.
func (u *User) IsEnabled() bool {
return u.DisabledAt == nil
}
// IsModerator will return if the user has moderation privileges.
func (u *User) IsModerator() bool {
_, hasModerationScope := utils.FindInSlice(u.Scopes, moderatorScopeKey)
return hasModerationScope
}
// SetupUsers will perform the initial initialization of the user package.
func SetupUsers() {
_datastore = data.GetDatastore()
}
func generateDisplayName() string {
suggestedUsernamesList := data.GetSuggestedUsernamesList()
if len(suggestedUsernamesList) >= minSuggestedUsernamePoolLength {
index := utils.RandomIndex(len(suggestedUsernamesList))
return suggestedUsernamesList[index]
} else {
return utils.GeneratePhrase()
}
}
// CreateAnonymousUser will create a new anonymous user with the provided display name.
func CreateAnonymousUser(displayName string) (*User, string, error) {
// Try to assign a name that was requested.
if displayName != "" {
// If name isn't available then generate a random one.
if available, _ := IsDisplayNameAvailable(displayName); !available {
displayName = generateDisplayName()
}
} else {
displayName = generateDisplayName()
}
displayColor := utils.GenerateRandomDisplayColor(config.MaxUserColor)
id := shortid.MustGenerate()
user := &User{
ID: id,
DisplayName: displayName,
DisplayColor: displayColor,
CreatedAt: time.Now(),
}
// Create new user.
if err := create(user); err != nil {
return nil, "", err
}
// Assign it an access token.
accessToken, err := utils.GenerateAccessToken()
if err != nil {
log.Errorln("Unable to create access token for new user")
return nil, "", err
}
if err := addAccessTokenForUser(accessToken, id); err != nil {
return nil, "", errors.Wrap(err, "unable to save access token for new user")
}
return user, accessToken, nil
}
// IsDisplayNameAvailable will check if the proposed name is available for use.
func IsDisplayNameAvailable(displayName string) (bool, error) {
if available, err := _datastore.GetQueries().IsDisplayNameAvailable(context.Background(), displayName); err != nil {
return false, errors.Wrap(err, "unable to check if display name is available")
} else if available != 0 {
return false, nil
}
return true, nil
}
// ChangeUsername will change the user associated to userID from one display name to another.
func ChangeUsername(userID string, username string) error {
_datastore.DbLock.Lock()
defer _datastore.DbLock.Unlock()
if err := _datastore.GetQueries().ChangeDisplayName(context.Background(), db.ChangeDisplayNameParams{
DisplayName: username,
ID: userID,
PreviousNames: sql.NullString{String: fmt.Sprintf(",%s", username), Valid: true},
NamechangedAt: sql.NullTime{Time: time.Now(), Valid: true},
}); err != nil {
return errors.Wrap(err, "unable to change display name")
}
return nil
}
// ChangeUserColor will change the user associated to userID from one display name to another.
func ChangeUserColor(userID string, color int) error {
_datastore.DbLock.Lock()
defer _datastore.DbLock.Unlock()
if err := _datastore.GetQueries().ChangeDisplayColor(context.Background(), db.ChangeDisplayColorParams{
DisplayColor: int32(color),
ID: userID,
}); err != nil {
return errors.Wrap(err, "unable to change display color")
}
return nil
}
func addAccessTokenForUser(accessToken, userID string) error {
return _datastore.GetQueries().AddAccessTokenForUser(context.Background(), db.AddAccessTokenForUserParams{
Token: accessToken,
UserID: userID,
})
}
func create(user *User) error {
_datastore.DbLock.Lock()
defer _datastore.DbLock.Unlock()
tx, err := _datastore.DB.Begin()
if err != nil {
log.Debugln(err)
}
defer func() {
_ = tx.Rollback()
}()
stmt, err := tx.Prepare("INSERT INTO users(id, display_name, display_color, previous_names, created_at) values(?, ?, ?, ?, ?)")
if err != nil {
log.Debugln(err)
}
defer stmt.Close()
_, err = stmt.Exec(user.ID, user.DisplayName, user.DisplayColor, user.DisplayName, user.CreatedAt)
if err != nil {
log.Errorln("error creating new user", err)
return err
}
return tx.Commit()
}
// SetEnabled will set the enabled status of a single user by ID.
func SetEnabled(userID string, enabled bool) error {
_datastore.DbLock.Lock()
defer _datastore.DbLock.Unlock()
tx, err := _datastore.DB.Begin()
if err != nil {
return err
}
defer tx.Rollback() //nolint
var stmt *sql.Stmt
if !enabled {
stmt, err = tx.Prepare("UPDATE users SET disabled_at=DATETIME('now', 'localtime') WHERE id IS ?")
} else {
stmt, err = tx.Prepare("UPDATE users SET disabled_at=null WHERE id IS ?")
}
if err != nil {
return err
}
defer stmt.Close()
if _, err := stmt.Exec(userID); err != nil {
return err
}
return tx.Commit()
}
// GetUserByToken will return a user by an access token.
func GetUserByToken(token string) *User {
u, err := _datastore.GetQueries().GetUserByAccessToken(context.Background(), token)
if err != nil {
return nil
}
var scopes []string
if u.Scopes.Valid {
scopes = strings.Split(u.Scopes.String, ",")
}
var disabledAt *time.Time
if u.DisabledAt.Valid {
disabledAt = &u.DisabledAt.Time
}
var authenticatedAt *time.Time
if u.AuthenticatedAt.Valid {
authenticatedAt = &u.AuthenticatedAt.Time
}
return &User{
ID: u.ID,
DisplayName: u.DisplayName,
DisplayColor: int(u.DisplayColor),
CreatedAt: u.CreatedAt.Time,
DisabledAt: disabledAt,
PreviousNames: strings.Split(u.PreviousNames.String, ","),
NameChangedAt: &u.NamechangedAt.Time,
AuthenticatedAt: authenticatedAt,
Authenticated: authenticatedAt != nil,
Scopes: scopes,
}
}
// SetAccessTokenToOwner will reassign an access token to be owned by a
// different user. Used for logging in with external auth.
func SetAccessTokenToOwner(token, userID string) error {
return _datastore.GetQueries().SetAccessTokenToOwner(context.Background(), db.SetAccessTokenToOwnerParams{
UserID: userID,
Token: token,
})
}
// SetUserAsAuthenticated will mark that a user has been authenticated
// in some way.
func SetUserAsAuthenticated(userID string) error {
return errors.Wrap(_datastore.GetQueries().SetUserAsAuthenticated(context.Background(), userID), "unable to set user as authenticated")
}
// SetModerator will add or remove moderator status for a single user by ID.
func SetModerator(userID string, isModerator bool) error {
if isModerator {
return addScopeToUser(userID, moderatorScopeKey)
}
return removeScopeFromUser(userID, moderatorScopeKey)
}
func addScopeToUser(userID string, scope string) error {
u := GetUserByID(userID)
if u == nil {
return errors.New("user not found when modifying scope")
}
scopesString := u.Scopes
scopes := utils.StringSliceToMap(scopesString)
scopes[scope] = true
scopesSlice := utils.StringMapKeys(scopes)
return setScopesOnUser(userID, scopesSlice)
}
func removeScopeFromUser(userID string, scope string) error {
u := GetUserByID(userID)
scopesString := u.Scopes
scopes := utils.StringSliceToMap(scopesString)
delete(scopes, scope)
scopesSlice := utils.StringMapKeys(scopes)
return setScopesOnUser(userID, scopesSlice)
}
func setScopesOnUser(userID string, scopes []string) error {
_datastore.DbLock.Lock()
defer _datastore.DbLock.Unlock()
tx, err := _datastore.DB.Begin()
if err != nil {
return err
}
defer tx.Rollback() //nolint
scopesSliceString := strings.TrimSpace(strings.Join(scopes, ","))
stmt, err := tx.Prepare("UPDATE users SET scopes=? WHERE id IS ?")
if err != nil {
return err
}
defer stmt.Close()
var val *string
if scopesSliceString == "" {
val = nil
} else {
val = &scopesSliceString
}
if _, err := stmt.Exec(val, userID); err != nil {
return err
}
return tx.Commit()
}
// GetUserByID will return a user by a user ID.
func GetUserByID(id string) *User {
_datastore.DbLock.Lock()
defer _datastore.DbLock.Unlock()
query := "SELECT id, display_name, display_color, created_at, disabled_at, previous_names, namechanged_at, scopes FROM users WHERE id = ?"
row := _datastore.DB.QueryRow(query, id)
if row == nil {
log.Errorln(row)
return nil
}
return getUserFromRow(row)
}
// GetDisabledUsers will return back all the currently disabled users that are not API users.
func GetDisabledUsers() []*User {
query := "SELECT id, display_name, scopes, display_color, created_at, disabled_at, previous_names, namechanged_at FROM users WHERE disabled_at IS NOT NULL AND type IS NOT 'API'"
rows, err := _datastore.DB.Query(query)
if err != nil {
log.Errorln(err)
return nil
}
defer rows.Close()
users := getUsersFromRows(rows)
sort.Slice(users, func(i, j int) bool {
return users[i].DisabledAt.Before(*users[j].DisabledAt)
})
return users
}
// GetModeratorUsers will return a list of users with moderator access.
func GetModeratorUsers() []*User {
query := `SELECT id, display_name, scopes, display_color, created_at, disabled_at, previous_names, namechanged_at FROM (
WITH RECURSIVE split(id, display_name, scopes, display_color, created_at, disabled_at, previous_names, namechanged_at, scope, rest) AS (
SELECT id, display_name, scopes, display_color, created_at, disabled_at, previous_names, namechanged_at, '', scopes || ',' FROM users
UNION ALL
SELECT id, display_name, scopes, display_color, created_at, disabled_at, previous_names, namechanged_at,
substr(rest, 0, instr(rest, ',')),
substr(rest, instr(rest, ',')+1)
FROM split
WHERE rest <> '')
SELECT id, display_name, scopes, display_color, created_at, disabled_at, previous_names, namechanged_at, scope
FROM split
WHERE scope <> ''
ORDER BY created_at
) AS token WHERE token.scope = ?`
rows, err := _datastore.DB.Query(query, moderatorScopeKey)
if err != nil {
log.Errorln(err)
return nil
}
defer rows.Close()
users := getUsersFromRows(rows)
return users
}
func getUsersFromRows(rows *sql.Rows) []*User {
users := make([]*User, 0)
for rows.Next() {
var id string
var displayName string
var displayColor int
var createdAt time.Time
var disabledAt *time.Time
var previousUsernames string
var userNameChangedAt *time.Time
var scopesString *string
if err := rows.Scan(&id, &displayName, &scopesString, &displayColor, &createdAt, &disabledAt, &previousUsernames, &userNameChangedAt); err != nil {
log.Errorln("error creating collection of users from results", err)
return nil
}
var scopes []string
if scopesString != nil {
scopes = strings.Split(*scopesString, ",")
}
user := &User{
ID: id,
DisplayName: displayName,
DisplayColor: displayColor,
CreatedAt: createdAt,
DisabledAt: disabledAt,
PreviousNames: strings.Split(previousUsernames, ","),
NameChangedAt: userNameChangedAt,
Scopes: scopes,
}
users = append(users, user)
}
sort.Slice(users, func(i, j int) bool {
return users[i].CreatedAt.Before(users[j].CreatedAt)
})
return users
}
func getUserFromRow(row *sql.Row) *User {
var id string
var displayName string
var displayColor int
var createdAt time.Time
var disabledAt *time.Time
var previousUsernames string
var userNameChangedAt *time.Time
var scopesString *string
if err := row.Scan(&id, &displayName, &displayColor, &createdAt, &disabledAt, &previousUsernames, &userNameChangedAt, &scopesString); err != nil {
return nil
}
var scopes []string
if scopesString != nil {
scopes = strings.Split(*scopesString, ",")
}
return &User{
ID: id,
DisplayName: displayName,
DisplayColor: displayColor,
CreatedAt: createdAt,
DisabledAt: disabledAt,
PreviousNames: strings.Split(previousUsernames, ","),
NameChangedAt: userNameChangedAt,
Scopes: scopes,
}
}

10
core/webhooks/chat.go

@ -43,6 +43,16 @@ func SendChatEventUserJoined(event events.UserJoinedEvent) { @@ -43,6 +43,16 @@ func SendChatEventUserJoined(event events.UserJoinedEvent) {
SendEventToWebhooks(webhookEvent)
}
// SendChatEventUserParted sends a webhook notifying that a user has parted.
func SendChatEventUserParted(event events.UserPartEvent) {
webhookEvent := WebhookEvent{
Type: events.UserParted,
EventData: event,
}
SendEventToWebhooks(webhookEvent)
}
// SendChatEventSetMessageVisibility sends a webhook notifying that the visibility of one or more
// messages has changed.
func SendChatEventSetMessageVisibility(event events.SetMessageVisibilityEvent) {

15
core/webhooks/webhooks.go

@ -5,6 +5,7 @@ import ( @@ -5,6 +5,7 @@ import (
"time"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/core/user"
"github.com/owncast/owncast/models"
)
@ -16,13 +17,13 @@ type WebhookEvent struct { @@ -16,13 +17,13 @@ type WebhookEvent struct {
// WebhookChatMessage represents a single chat message sent as a webhook payload.
type WebhookChatMessage struct {
User *models.User `json:"user,omitempty"`
Timestamp *time.Time `json:"timestamp,omitempty"`
Body string `json:"body,omitempty"`
RawBody string `json:"rawBody,omitempty"`
ID string `json:"id,omitempty"`
ClientID uint `json:"clientId,omitempty"`
Visible bool `json:"visible"`
User *user.User `json:"user,omitempty"`
Timestamp *time.Time `json:"timestamp,omitempty"`
Body string `json:"body,omitempty"`
RawBody string `json:"rawBody,omitempty"`
ID string `json:"id,omitempty"`
ClientID uint `json:"clientId,omitempty"`
Visible bool `json:"visible"`
}
// SendEventToWebhooks will send a single webhook event to all webhook destinations.

7
core/webhooks/webhooks_test.go

@ -12,6 +12,7 @@ import ( @@ -12,6 +12,7 @@ import (
"testing"
"time"
"github.com/owncast/owncast/core/chat/events"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models"
jsonpatch "gopkg.in/evanphx/json-patch.v5"
@ -51,7 +52,7 @@ func TestMain(m *testing.M) { @@ -51,7 +52,7 @@ func TestMain(m *testing.M) {
// this test ensures that `SendToWebhooks` without a `WaitGroup` doesn't panic.
func TestPublicSend(t *testing.T) {
// Send enough events to be sure at least one worker delivers a second event.
const eventsCount = webhookWorkerPoolSize + 1
eventsCount := webhookWorkerPoolSize + 1
var wg sync.WaitGroup
wg.Add(eventsCount)
@ -84,7 +85,7 @@ func TestPublicSend(t *testing.T) { @@ -84,7 +85,7 @@ func TestPublicSend(t *testing.T) {
// Make sure that events are only sent to interested endpoints.
func TestRouting(t *testing.T) {
eventTypes := []models.EventType{models.ChatActionSent, models.UserJoined}
eventTypes := []models.EventType{models.ChatActionSent, models.UserJoined, events.UserParted}
calls := map[models.EventType]int{}
var lock sync.Mutex
@ -267,7 +268,7 @@ func TestParallel(t *testing.T) { @@ -267,7 +268,7 @@ func TestParallel(t *testing.T) {
myId := atomic.AddUint32(&calls, 1)
// We made it to the pool size + 1 event, so we're done with the test.
if myId == webhookWorkerPoolSize+1 {
if myId == uint32(webhookWorkerPoolSize)+1 {
close(finished)
return
}

13
core/webhooks/workerpool.go

@ -4,6 +4,7 @@ import ( @@ -4,6 +4,7 @@ import (
"bytes"
"encoding/json"
"net/http"
"runtime"
"sync"
log "github.com/sirupsen/logrus"
@ -12,16 +13,14 @@ import ( @@ -12,16 +13,14 @@ import (
"github.com/owncast/owncast/models"
)
const (
// webhookWorkerPoolSize defines the number of concurrent HTTP webhook requests.
webhookWorkerPoolSize = 10
)
// webhookWorkerPoolSize defines the number of concurrent HTTP webhook requests.
var webhookWorkerPoolSize = runtime.GOMAXPROCS(0)
// Job struct bundling the webhook and the payload in one struct.
type Job struct {
webhook models.Webhook
payload WebhookEvent
wg *sync.WaitGroup
payload WebhookEvent
webhook models.Webhook
}
var (
@ -47,7 +46,7 @@ func initWorkerPool() { @@ -47,7 +46,7 @@ func initWorkerPool() {
func addToQueue(webhook models.Webhook, payload WebhookEvent, wg *sync.WaitGroup) {
log.Tracef("Queued Event %s for Webhook %s", payload.Type, webhook.URL)
queue <- Job{webhook, payload, wg}
queue <- Job{wg, payload, webhook}
}
func worker(workerID int, queue <-chan Job) {

2
db/query.sql

@ -101,7 +101,7 @@ UPDATE users SET authenticated_at = CURRENT_TIMESTAMP WHERE id = $1; @@ -101,7 +101,7 @@ UPDATE users SET authenticated_at = CURRENT_TIMESTAMP WHERE id = $1;
SELECT id, body, hidden_at, timestamp FROM messages WHERE eventType = 'CHAT' AND user_id = $1 ORDER BY TIMESTAMP DESC;
-- name: IsDisplayNameAvailable :one
SELECT count(*) FROM users WHERE display_name = $1 AND authenticated_at is not null AND disabled_at is NULL;
SELECT count(*) FROM users WHERE display_name = $1 AND ( type='API' OR authenticated_at IS NOT NULL ) AND disabled_at IS NULL;
-- name: ChangeDisplayName :exec
UPDATE users SET display_name = $1, previous_names = previous_names || $2, namechanged_at = $3 WHERE id = $4;

4
db/query.sql.go

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.15.0
// sqlc v1.19.1
// source: query.sql
package db
@ -667,7 +667,7 @@ func (q *Queries) GetUserDisplayNameByToken(ctx context.Context, token string) ( @@ -667,7 +667,7 @@ func (q *Queries) GetUserDisplayNameByToken(ctx context.Context, token string) (
}
const isDisplayNameAvailable = `-- name: IsDisplayNameAvailable :one
SELECT count(*) FROM users WHERE display_name = $1 AND authenticated_at is not null AND disabled_at is NULL
SELECT count(*) FROM users WHERE display_name = $1 AND ( type='API' OR authenticated_at IS NOT NULL ) AND disabled_at IS NULL
`
func (q *Queries) IsDisplayNameAvailable(ctx context.Context, displayName string) (int64, error) {

14
docs/api/index.html

File diff suppressed because one or more lines are too long

2
geoip/geoip.go

@ -76,7 +76,7 @@ func (c *Client) fetchGeoForIP(ip string) *GeoDetails { @@ -76,7 +76,7 @@ func (c *Client) fetchGeoForIP(ip string) *GeoDetails {
// If no country is available then exit
// If we believe this IP to be anonymous then no reason to report it
if record.Country.IsoCode != "" && !record.Traits.IsAnonymousProxy {
var regionName = "Unknown"
regionName := "Unknown"
if len(record.Subdivisions) > 0 {
if region, ok := record.Subdivisions[0].Names["en"]; ok {
regionName = region

60
go.mod

@ -1,26 +1,26 @@ @@ -1,26 +1,26 @@
module github.com/owncast/owncast
go 1.20
go 1.21
require (
github.com/aws/aws-sdk-go v1.44.273
github.com/aws/aws-sdk-go v1.49.6
github.com/go-fed/activity v1.0.1-0.20210803212804-d866ba75dd0f
github.com/go-fed/httpsig v1.1.0
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/gorilla/websocket v1.5.0
github.com/gorilla/websocket v1.5.1
github.com/grafov/m3u8 v0.12.0
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
github.com/mattn/go-sqlite3 v1.14.17
github.com/microcosm-cc/bluemonday v1.0.24
github.com/mattn/go-sqlite3 v1.14.19
github.com/microcosm-cc/bluemonday v1.0.26
github.com/nareix/joy5 v0.0.0-20210317075623-2c912ca30590
github.com/oschwald/geoip2-golang v1.8.0
github.com/oschwald/geoip2-golang v1.9.0
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
github.com/schollz/sqlite3dump v1.3.1
github.com/sirupsen/logrus v1.9.3
github.com/teris-io/shortid v0.0.0-20220617161101-71ec9f2aa569
github.com/yuin/goldmark v1.5.4
golang.org/x/mod v0.10.0
golang.org/x/time v0.3.0
github.com/yuin/goldmark v1.6.0
golang.org/x/mod v0.14.0
golang.org/x/time v0.5.0
)
require (
@ -28,53 +28,55 @@ require ( @@ -28,53 +28,55 @@ require (
github.com/lestrrat-go/strftime v1.0.4 // indirect
github.com/mvdan/xurls v1.1.0 // indirect
github.com/pkg/errors v0.9.1
github.com/tklauser/go-sysconf v0.3.11 // indirect
github.com/tklauser/numcpus v0.6.0 // indirect
github.com/yusufpapurcu/wmi v1.2.2 // indirect
golang.org/x/crypto v0.1.0 // indirect
golang.org/x/net v0.10.0
golang.org/x/sys v0.8.0 // indirect
github.com/tklauser/go-sysconf v0.3.12 // indirect
github.com/tklauser/numcpus v0.6.1 // indirect
github.com/yusufpapurcu/wmi v1.2.3 // indirect
golang.org/x/crypto v0.17.0 // indirect
golang.org/x/net v0.19.0
golang.org/x/sys v0.15.0 // indirect
)
require github.com/prometheus/client_golang v1.15.1
require github.com/prometheus/client_golang v1.17.0
require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/klauspost/compress v1.16.4 // indirect
github.com/klauspost/compress v1.16.7 // indirect
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
github.com/prometheus/client_model v0.3.0 // indirect
github.com/prometheus/common v0.42.0 // indirect
github.com/prometheus/procfs v0.9.0 // indirect
golang.org/x/text v0.9.0 // indirect
google.golang.org/protobuf v1.30.0 // indirect
github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect
github.com/prometheus/common v0.44.0 // indirect
github.com/prometheus/procfs v0.11.1 // indirect
golang.org/x/text v0.14.0 // indirect
google.golang.org/protobuf v1.31.0 // indirect
)
require (
github.com/nakabonne/tstorage v0.3.6
github.com/shirou/gopsutil/v3 v3.23.3
github.com/shirou/gopsutil/v3 v3.23.11
)
require github.com/SherClockHolmes/webpush-go v1.2.0
require github.com/SherClockHolmes/webpush-go v1.3.0
require (
github.com/andybalholm/brotli v1.0.4 // indirect
github.com/andybalholm/brotli v1.0.5 // indirect
github.com/aymerick/douceur v0.2.0 // indirect
github.com/go-test/deep v1.0.4 // indirect
github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
github.com/gorilla/css v1.0.0 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/oschwald/maxminddb-golang v1.10.0 // indirect
github.com/shoenig/go-m1cpu v0.1.4 // indirect
github.com/oschwald/maxminddb-golang v1.11.0 // indirect
github.com/shoenig/go-m1cpu v0.1.6 // indirect
)
require (
github.com/CAFxX/httpcompression v0.0.8
github.com/CAFxX/httpcompression v0.0.9
github.com/andybalholm/cascadia v1.3.2
gopkg.in/evanphx/json-patch.v5 v5.6.0
github.com/mssola/user_agent v0.6.0
github.com/yuin/goldmark-emoji v1.0.2
gopkg.in/evanphx/json-patch.v5 v5.7.0
mvdan.cc/xurls v1.1.0
)

156
go.sum

@ -1,13 +1,13 @@ @@ -1,13 +1,13 @@
github.com/CAFxX/httpcompression v0.0.8 h1:UBWojERnpCS6X7whJkGGZeCC3ruZBRwkwkcnfGfb0ko=
github.com/CAFxX/httpcompression v0.0.8/go.mod h1:bVd1taHK1vYb5SWe9lwNDCqrfj2ka+C1Zx7JHzxuHnU=
github.com/SherClockHolmes/webpush-go v1.2.0 h1:sGv0/ZWCvb1HUH+izLqrb2i68HuqD/0Y+AmGQfyqKJA=
github.com/SherClockHolmes/webpush-go v1.2.0/go.mod h1:w6X47YApe/B9wUz2Wh8xukxlyupaxSSEbu6yKJcHN2w=
github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY=
github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
github.com/CAFxX/httpcompression v0.0.9 h1:0ue2X8dOLEpxTm8tt+OdHcgA+gbDge0OqFQWGKSqgrg=
github.com/CAFxX/httpcompression v0.0.9/go.mod h1:XX8oPZA+4IDcfZ0A71Hz0mZsv/YJOgYygkFhizVPilM=
github.com/SherClockHolmes/webpush-go v1.3.0 h1:CAu3FvEE9QS4drc3iKNgpBWFfGqNthKlZhp5QpYnu6k=
github.com/SherClockHolmes/webpush-go v1.3.0/go.mod h1:AxRHmJuYwKGG1PVgYzToik1lphQvDnqFYDqimHvwhIw=
github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss=
github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
github.com/aws/aws-sdk-go v1.44.273 h1:CX8O0gK+cGrgUyv7bgJ6QQP9mQg7u5mweHdNzULH47c=
github.com/aws/aws-sdk-go v1.44.273/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI=
github.com/aws/aws-sdk-go v1.49.6 h1:yNldzF5kzLBRvKlKz1S0bkvc2+04R1kt13KfBWQBfFA=
github.com/aws/aws-sdk-go v1.49.6/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk=
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
@ -30,20 +30,20 @@ github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keL @@ -30,20 +30,20 @@ github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keL
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/brotli/go/cbrotli v0.0.0-20210623081221-ce222e317e36 h1:qg5qEpjk1P1EMnInOCpxOpWSPRsspXJDT7P80y/JfFA=
github.com/google/brotli/go/cbrotli v0.0.0-20210623081221-ce222e317e36/go.mod h1:nOPhAkwVliJdNTkj3gXpljmWhjc4wCaVqbMJcPKWP4s=
github.com/google/brotli/go/cbrotli v0.0.0-20230829110029-ed738e842d2f h1:jopqB+UTSdJGEJT8tEqYyE29zN91fi2827oLET8tl7k=
github.com/google/brotli/go/cbrotli v0.0.0-20230829110029-ed738e842d2f/go.mod h1:nOPhAkwVliJdNTkj3gXpljmWhjc4wCaVqbMJcPKWP4s=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
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.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
github.com/grafov/m3u8 v0.12.0 h1:T6iTwTsSEtMcwkayef+FJO8kj+Sglr4Lh81Zj8Ked/4=
github.com/grafov/m3u8 v0.12.0/go.mod h1:nqzOkfBiZJENr52zTVd/Dcl03yzphIMbJqkXGu+u080=
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
@ -52,10 +52,9 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGw @@ -52,10 +52,9 @@ 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/klauspost/compress v1.14.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/klauspost/compress v1.16.4 h1:91KN02FnsOYhuunwU4ssRe8lc2JosWmizWa91B5v1PU=
github.com/klauspost/compress v1.16.4/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
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=
@ -65,26 +64,28 @@ github.com/lestrrat-go/strftime v1.0.4/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR7 @@ -65,26 +64,28 @@ github.com/lestrrat-go/strftime v1.0.4/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR7
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM=
github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
github.com/mattn/go-sqlite3 v1.14.19 h1:fhGleo2h1p8tVChob4I9HpmVFIAkKGpiukdrgQbWfGI=
github.com/mattn/go-sqlite3 v1.14.19/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
github.com/microcosm-cc/bluemonday v1.0.24 h1:NGQoPtwGVcbGkKfvyYk1yRqknzBuoMiUrO6R7uFTPlw=
github.com/microcosm-cc/bluemonday v1.0.24/go.mod h1:ArQySAMps0790cHSkdPEJ7bGkF2VePWH773hsJNSHf8=
github.com/microcosm-cc/bluemonday v1.0.26 h1:xbqSvqzQMeEHCqMi64VAs4d8uy6Mequs3rQ0k/Khz58=
github.com/microcosm-cc/bluemonday v1.0.26/go.mod h1:JyzOCs9gkyQyjs+6h10UEVSe02CGwkhd72Xdqh78TWs=
github.com/mssola/user_agent v0.6.0 h1:uwPR4rtWlCHRFyyP9u2KOV0u8iQXmS7Z7feTrstQwk4=
github.com/mssola/user_agent v0.6.0/go.mod h1:TTPno8LPY3wAIEKRpAtkdMT0f8SE24pLRGPahjCH4uw=
github.com/mvdan/xurls v1.1.0 h1:OpuDelGQ1R1ueQ6sSryzi6P+1RtBpfQHM8fJwlE45ww=
github.com/mvdan/xurls v1.1.0/go.mod h1:tQlNn3BED8bE/15hnSL2HLkDeLWpNPAwtw7wkEq44oU=
github.com/nakabonne/tstorage v0.3.6 h1:usp7pTohax8mynnFiUSUQ2QVBCKLCkYx3gmb3+rJo54=
github.com/nakabonne/tstorage v0.3.6/go.mod h1:1xUrK3s1MXSlU6dn96xHerHx/MdO4BGmsAHEUbsaOxU=
github.com/nareix/joy5 v0.0.0-20210317075623-2c912ca30590 h1:PnxRU8L8Y2q82vFC2QdNw23Dm2u6WrjecIdpXjiYbXM=
github.com/nareix/joy5 v0.0.0-20210317075623-2c912ca30590/go.mod h1:XmAOs6UJXpNXRwKk+KY/nv5kL6xXYXyellk+A1pTlko=
github.com/oschwald/geoip2-golang v1.8.0 h1:KfjYB8ojCEn/QLqsDU0AzrJ3R5Qa9vFlx3z6SLNcKTs=
github.com/oschwald/geoip2-golang v1.8.0/go.mod h1:R7bRvYjOeaoenAp9sKRS8GX5bJWcZ0laWO5+DauEktw=
github.com/oschwald/maxminddb-golang v1.10.0 h1:Xp1u0ZhqkSuopaKmk1WwHtjF0H9Hd9181uj2MQ5Vndg=
github.com/oschwald/maxminddb-golang v1.10.0/go.mod h1:Y2ELenReaLAZ0b400URyGwvYxHV1dLIxBuyOsyYjHK0=
github.com/oschwald/geoip2-golang v1.9.0 h1:uvD3O6fXAXs+usU+UGExshpdP13GAqp4GBrzN7IgKZc=
github.com/oschwald/geoip2-golang v1.9.0/go.mod h1:BHK6TvDyATVQhKNbQBdrj9eAvuwOMi2zSFXizL3K81Y=
github.com/oschwald/maxminddb-golang v1.11.0 h1:aSXMqYR/EPNjGE8epgqwDay+P30hCBZIveY0WZbAWh0=
github.com/oschwald/maxminddb-golang v1.11.0/go.mod h1:YmVI+H0zh3ySFR3w+oz8PCfglAFj3PuCmui13+P9zDg=
github.com/owncast/activity v1.0.1-0.20211229051252-7821289d4026 h1:E1nxiX44BcMQTSSs8MHLm2rXnqXNedYZkFI31gXMsJc=
github.com/owncast/activity v1.0.1-0.20211229051252-7821289d4026/go.mod h1:v4QoPaAzjWZ8zN2VFVGL5ep9C02mst0hQYHUpQwso4Q=
github.com/pierrec/lz4/v4 v4.1.12 h1:44l88ehTZAUGW4VlO1QC4zkilL99M6Y9MXNwEs0uzP8=
github.com/pierrec/lz4/v4 v4.1.12/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ=
github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@ -92,24 +93,24 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb @@ -92,24 +93,24 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw=
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI=
github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q=
github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY=
github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM=
github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY=
github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY=
github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI=
github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY=
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 h1:mZHayPoR0lNmnHyvtYjDeq0zlVHn9K/ZXoy17ylucdo=
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5/go.mod h1:GEXHk5HgEKCvEIIrSpFI3ozzG5xOKA2DVlEX/gGnewM=
github.com/schollz/sqlite3dump v1.3.1 h1:QXizJ7XEJ7hggjqjZ3YRtF3+javm8zKtzNByYtEkPRA=
github.com/schollz/sqlite3dump v1.3.1/go.mod h1:mzSTjZpJH4zAb1FN3iNlhWPbbdyeBpOaTW0hukyMHyI=
github.com/shirou/gopsutil/v3 v3.23.3 h1:Syt5vVZXUDXPEXpIBt5ziWsJ4LdSAAxF4l/xZeQgSEE=
github.com/shirou/gopsutil/v3 v3.23.3/go.mod h1:lSBNN6t3+D6W5e5nXTxc8KIMMVxAcS+6IJlffjRRlMU=
github.com/shoenig/go-m1cpu v0.1.4 h1:SZPIgRM2sEF9NJy50mRHu9PKGwxyyTTJIWvCtgVbozs=
github.com/shoenig/go-m1cpu v0.1.4/go.mod h1:Wwvst4LR89UxjeFtLRMrpgRiyY4xPsejnVZym39dbAQ=
github.com/shoenig/test v0.6.3 h1:GVXWJFk9PiOjN0KoJ7VrJGH6uLPnqxR7/fe3HUPfE0c=
github.com/shoenig/test v0.6.3/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
github.com/shirou/gopsutil/v3 v3.23.11 h1:i3jP9NjCPUz7FiZKxlMnODZkdSIp2gnzfrvsu9CuWEQ=
github.com/shirou/gopsutil/v3 v3.23.11/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM=
github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU=
github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/spf13/cobra v0.0.4-0.20190109003409-7547e83b2d85/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
@ -122,42 +123,46 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV @@ -122,42 +123,46 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/teris-io/shortid v0.0.0-20220617161101-71ec9f2aa569 h1:xzABM9let0HLLqFypcxvLmlvEciCHL7+Lv+4vwZqecI=
github.com/teris-io/shortid v0.0.0-20220617161101-71ec9f2aa569/go.mod h1:2Ly+NIftZN4de9zRmENdYbvPQeaVIYKWpLFStLFEBgI=
github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM=
github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI=
github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms=
github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4=
github.com/valyala/gozstd v1.11.0 h1:VV6qQFt+4sBBj9OJ7eKVvsFAMy59Urcs9Lgd+o5FOw0=
github.com/valyala/gozstd v1.11.0/go.mod h1:y5Ew47GLlP37EkTB+B4s7r6A5rdaeB7ftbl9zoYiIPQ=
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
github.com/valyala/gozstd v1.20.1 h1:xPnnnvjmaDDitMFfDxmQ4vpx0+3CdTg2o3lALvXTU/g=
github.com/valyala/gozstd v1.20.1/go.mod h1:y5Ew47GLlP37EkTB+B4s7r6A5rdaeB7ftbl9zoYiIPQ=
github.com/yuin/goldmark v1.3.7/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yuin/goldmark v1.5.4 h1:2uY/xC0roWy8IBEGLgB1ywIoEJFGmRrX21YQcvGZzjU=
github.com/yuin/goldmark v1.5.4/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=
github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
github.com/yuin/goldmark v1.6.0 h1:boZcn2GTjpsynOsC0iJHnBWa4Bi0qzfJjthwauItG68=
github.com/yuin/goldmark v1.6.0/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yuin/goldmark-emoji v1.0.2 h1:c/RgTShNgHTtc6xdz2KKI74jJr6rWi7FPgnP9GAsO5s=
github.com/yuin/goldmark-emoji v1.0.2/go.mod h1:RhP/RWpexdp+KHs7ghKnifRoIs/Bq4nDS7tRbCkOwKY=
github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
golang.org/x/crypto v0.0.0-20180527072434-ab813273cd59/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190131182504-b8fe1690c613/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=
golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0=
golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@ -172,28 +177,28 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc @@ -172,28 +177,28 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4=
golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
@ -202,13 +207,14 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T @@ -202,13 +207,14 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/evanphx/json-patch.v5 v5.6.0 h1:BMT6KIwBD9CaU91PJCZIe46bDmBWa9ynTQgJIOpfQBk=
gopkg.in/evanphx/json-patch.v5 v5.6.0/go.mod h1:/kvTRh1TVm5wuM6OkHxqXtE/1nUZZpihg29RtuIyfvk=
gopkg.in/evanphx/json-patch.v5 v5.7.0 h1:dGKGylPlZ/jus2g1YqhhyzfH0gPy2R8/MYUpW/OslTY=
gopkg.in/evanphx/json-patch.v5 v5.7.0/go.mod h1:/kvTRh1TVm5wuM6OkHxqXtE/1nUZZpihg29RtuIyfvk=
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=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

2
logging/logging.go

@ -34,7 +34,7 @@ func Setup(enableDebugOptions bool, enableVerboseLogging bool) { @@ -34,7 +34,7 @@ func Setup(enableDebugOptions bool, enableVerboseLogging bool) {
// Create the logging directory if needed
loggingDirectory := filepath.Dir(getLogFilePath())
if !utils.DoesFileExists(loggingDirectory) {
if err := os.Mkdir(loggingDirectory, 0700); err != nil {
if err := os.Mkdir(loggingDirectory, 0o700); err != nil {
logger.Errorln("unable to create logs directory", loggingDirectory, err)
}
}

6
metrics/metrics.go

@ -10,8 +10,10 @@ import ( @@ -10,8 +10,10 @@ import (
)
// How often we poll for updates.
const hardwareMetricsPollingInterval = 2 * time.Minute
const playbackMetricsPollingInterval = 2 * time.Minute
const (
hardwareMetricsPollingInterval = 2 * time.Minute
playbackMetricsPollingInterval = 2 * time.Minute
)
const (
// How often we poll for updates.

19
models/externalAPIUser.go

@ -1,19 +0,0 @@ @@ -1,19 +0,0 @@
package models
import (
"time"
)
// ExternalAPIUser represents a single 3rd party integration that uses an access token.
// This struct mostly matches the User struct so they can be used interchangeably.
type ExternalAPIUser struct {
CreatedAt time.Time `json:"createdAt"`
LastUsedAt *time.Time `json:"lastUsedAt,omitempty"`
ID string `json:"id"`
AccessToken string `json:"accessToken"`
DisplayName string `json:"displayName"`
Type string `json:"type,omitempty"` // Should be API
Scopes []string `json:"scopes"`
DisplayColor int `json:"displayColor"`
IsBot bool `json:"isBot"`
}

19
models/s3Storage.go

@ -2,17 +2,20 @@ package models @@ -2,17 +2,20 @@ package models
// S3 is the storage configuration.
type S3 struct {
Enabled bool `json:"enabled"`
Endpoint string `json:"endpoint,omitempty"`
AccessKey string `json:"accessKey,omitempty"`
Secret string `json:"secret,omitempty"`
Bucket string `json:"bucket,omitempty"`
Region string `json:"region,omitempty"`
ACL string `json:"acl,omitempty"`
ForcePathStyle bool `json:"forcePathStyle"`
Endpoint string `json:"endpoint,omitempty"`
AccessKey string `json:"accessKey,omitempty"`
Secret string `json:"secret,omitempty"`
Bucket string `json:"bucket,omitempty"`
Region string `json:"region,omitempty"`
ACL string `json:"acl,omitempty"`
// PathPrefix is an optional prefix for object storage.
PathPrefix string `json:"pathPrefix,omitempty"`
// This property is no longer used as of v0.1.1. See the standalone
// property that was pulled out of here instead. It's only left here
// to allow the migration to take place without data loss.
ServingEndpoint string `json:"-"`
Enabled bool `json:"enabled"`
ForcePathStyle bool `json:"forcePathStyle"`
}

36
models/user.go

@ -1,36 +0,0 @@ @@ -1,36 +0,0 @@
package models
import (
"time"
"github.com/owncast/owncast/utils"
)
const (
moderatorScopeKey = "MODERATOR"
)
type User struct {
CreatedAt time.Time `json:"createdAt"`
DisabledAt *time.Time `json:"disabledAt,omitempty"`
NameChangedAt *time.Time `json:"nameChangedAt,omitempty"`
AuthenticatedAt *time.Time `json:"-"`
ID string `json:"id"`
DisplayName string `json:"displayName"`
PreviousNames []string `json:"previousNames"`
Scopes []string `json:"scopes,omitempty"`
DisplayColor int `json:"displayColor"`
IsBot bool `json:"isBot"`
Authenticated bool `json:"authenticated"`
}
// IsEnabled will return if this single user is enabled.
func (u *User) IsEnabled() bool {
return u.DisabledAt == nil
}
// IsModerator will return if the user has moderation privileges.
func (u *User) IsModerator() bool {
_, hasModerationScope := utils.FindInSlice(u.Scopes, moderatorScopeKey)
return hasModerationScope
}

10
openapi.yaml

@ -356,7 +356,7 @@ components: @@ -356,7 +356,7 @@ components:
StreamKey:
type: object
properties:
id:
key:
type: string
description: The key used for authing a stream.
example: yklw5Imng
@ -1086,7 +1086,10 @@ paths: @@ -1086,7 +1086,10 @@ paths:
content:
application/json:
schema:
$ref: '#/components/schemas/StreamKeyArray'
type: object
properties:
value:
$ref: '#/components/schemas/StreamKeyArray'
/api/admin/config/pagecontent:
post:
@ -1103,7 +1106,8 @@ paths: @@ -1103,7 +1106,8 @@ paths:
application/json:
schema:
$ref: '#/components/schemas/ConfigValue'
example: '# Welcome to my cool server!<br><br>I _hope_ you enjoy it.'
example:
value: '# Welcome to my cool server!<br><br>I _hope_ you enjoy it.'
/api/admin/config/streamtitle:
post:

23
router/middleware/auth.go

@ -6,16 +6,16 @@ import ( @@ -6,16 +6,16 @@ import (
"strings"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models"
"github.com/owncast/owncast/core/user"
"github.com/owncast/owncast/utils"
log "github.com/sirupsen/logrus"
)
// ExternalAccessTokenHandlerFunc is a function that is called after validing access.
type ExternalAccessTokenHandlerFunc func(models.ExternalAPIUser, http.ResponseWriter, *http.Request)
type ExternalAccessTokenHandlerFunc func(user.ExternalAPIUser, http.ResponseWriter, *http.Request)
// UserAccessTokenHandlerFunc is a function that is called after validing user access.
type UserAccessTokenHandlerFunc func(models.User, http.ResponseWriter, *http.Request)
type UserAccessTokenHandlerFunc func(user.User, http.ResponseWriter, *http.Request)
// RequireAdminAuth wraps a handler requiring HTTP basic auth for it using the given
// the stream key as the password and and a hardcoded "admin" for username.
@ -25,11 +25,9 @@ func RequireAdminAuth(handler http.HandlerFunc) http.HandlerFunc { @@ -25,11 +25,9 @@ func RequireAdminAuth(handler http.HandlerFunc) http.HandlerFunc {
password := data.GetAdminPassword()
realm := "Owncast Authenticated Request"
// The following line is kind of a work around.
// If you want HTTP Basic Auth + Cors it requires _explicit_ origins to be provided in the
// Access-Control-Allow-Origin header. So we just pull out the origin header and specify it.
// If we want to lock down admin APIs to not be CORS accessible for anywhere, this is where we would do that.
w.Header().Set("Access-Control-Allow-Origin", r.Header.Get("Origin"))
// Alow CORS only for localhost:3000 to support Owncast development.
validAdminHost := "http://localhost:3000"
w.Header().Set("Access-Control-Allow-Origin", validAdminHost)
w.Header().Set("Access-Control-Allow-Credentials", "true")
w.Header().Set("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization")
@ -69,10 +67,13 @@ func RequireExternalAPIAccessToken(scope string, handler ExternalAccessTokenHand @@ -69,10 +67,13 @@ func RequireExternalAPIAccessToken(scope string, handler ExternalAccessTokenHand
return
}
authHeader := strings.Split(r.Header.Get("Authorization"), "Bearer ")
token := strings.Join(authHeader, "")
authHeader := r.Header.Get("Authorization")
token := ""
if strings.HasPrefix(strings.ToLower(authHeader), "bearer ") {
token = authHeader[len("bearer "):]
}
if len(authHeader) == 0 || token == "" {
if token == "" {
log.Warnln("invalid access token")
accessDenied(w)
return

83
static/metadata.html.tmpl vendored

@ -0,0 +1,83 @@ @@ -0,0 +1,83 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>{{.Name}}</title>
<meta name="description" content="{{.Summary}}">
<meta property="og:title" content="{{.Name}}">
<meta property="og:site_name" content="{{.Name}}">
<meta property="og:url" content="{{.RequestedURL}}">
<meta property="og:description" content="{{.Summary}}">
<meta property="og:type" content="video.other">
<meta property="video:tag" content="{{.TagsString}}">
<meta property="og:image" content="{{.Thumbnail}}">
<meta property="og:image:url" content="{{.Thumbnail}}">
<meta property="og:image:alt" content="{{.Image}}">
<meta property="og:video" content='{{.RequestedURL}}embed/video' />
<meta property="og:video:secure_url" content='{{.RequestedURL}}embed/video' />
<meta property="og:video:height" content="315" />
<meta property="og:video:width" content="560" />
<meta property="og:video:type" content="text/html" />
<meta property="og:video:actor" content="{{.Name}}" />
<meta property="twitter:title" content="{{.Name}}">
<meta property="twitter:url" content="{{.RequestedURL}}">
<meta property="twitter:description" content="{{.Summary}}">
<meta property="twitter:image" content="{{.Image}}">
<meta property="twitter:card" content="player" />
<meta property="twitter:player" content='{{.RequestedURL}}embed/video' />
<meta property="twitter:player:width" content="560" />
<meta property="twitter:player:height" content="315" />
<link rel="apple-touch-icon" sizes="57x57" href="/img/favicon/apple-icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/img/favicon/apple-icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/img/favicon/apple-icon-72x72.png">
<link rel="apple-touch-icon" sizes="76x76" href="/img/favicon/apple-icon-76x76.png">
<link rel="apple-touch-icon" sizes="114x114" href="/img/favicon/apple-icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="/img/favicon/apple-icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/img/favicon/apple-icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/img/favicon/apple-icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicon/apple-icon-180x180.png">
<link rel="icon" type="image/png" sizes="192x192" href="/img/favicon/android-icon-192x192.png">
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicon/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="96x96" href="/img/favicon/favicon-96x96.png">
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicon/favicon-16x16.png">
<link rel="manifest" href="/manifest.json">
<link rel="authorization_endpoint" href="/api/auth/provider/indieauth">
<meta name="msapplication-TileColor" content="#ffffff">
<meta name="msapplication-TileImage" content="/img/favicon/ms-icon-144x144.png">
<meta name="theme-color" content="#ffffff">
</head>
<body>
<h1>{{.Name}}</h1>
<center>
<img src="{{.Thumbnail}}" width=10% />
</center>
<h3>{{.Summary}}</h3>
{{range .Tags}}
<li>{{.}}</li>
{{end}}
<br/>
<h3>Links for {{.Name}}:</h3>
{{range .SocialHandles}}
<li><a href="{{.URL}}">{{.Platform}}</a></li>
{{end}}
</body>
</html>

11
static/static.go vendored

@ -76,3 +76,14 @@ func getFileSystemStaticFileOrDefault(path string, defaultData []byte) []byte { @@ -76,3 +76,14 @@ func getFileSystemStaticFileOrDefault(path string, defaultData []byte) []byte {
return data
}
//go:embed metadata.html.tmpl
var botMetadataTemplate embed.FS
// GetBotMetadataTemplate will return the bot/scraper metadata template.
func GetBotMetadataTemplate() (*template.Template, error) {
name := "metadata.html.tmpl"
t, err := template.ParseFS(botMetadataTemplate, name)
tmpl := template.Must(t, err)
return tmpl, err
}

6
static/web/404.html vendored

File diff suppressed because one or more lines are too long

6
static/web/404/index.html vendored

File diff suppressed because one or more lines are too long

1
static/web/_next/static/7FO45oyNxons-CT00qbSN/_buildManifest.js

File diff suppressed because one or more lines are too long

0
static/web/_next/static/_EwXAWpD9Ghec1YlZX6x3/_ssgManifest.js → static/web/_next/static/7FO45oyNxons-CT00qbSN/_ssgManifest.js

1
static/web/_next/static/_EwXAWpD9Ghec1YlZX6x3/_buildManifest.js

File diff suppressed because one or more lines are too long

1
static/web/_next/static/chunks/1008.34cc20ecda8c2f89.js vendored

@ -1 +0,0 @@ @@ -1 +0,0 @@
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1008],{98696:function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M816 768h-24V428c0-141.1-104.3-257.7-240-277.1V112c0-22.1-17.9-40-40-40s-40 17.9-40 40v38.9c-135.7 19.4-240 136-240 277.1v340h-24c-17.7 0-32 14.3-32 32v32c0 4.4 3.6 8 8 8h216c0 61.8 50.2 112 112 112s112-50.2 112-112h216c4.4 0 8-3.6 8-8v-32c0-17.7-14.3-32-32-32zM512 888c-26.5 0-48-21.5-48-48h96c0 26.5-21.5 48-48 48zM304 768V428c0-55.6 21.6-107.8 60.9-147.1S456.4 220 512 220c55.6 0 107.8 21.6 147.1 60.9S720 372.4 720 428v340H304z"}}]},name:"bell",theme:"outlined"}},11008:function(e,t,r){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var a,n=(a=r(25594))&&a.__esModule?a:{default:a};t.default=n,e.exports=n},25594:function(e,t,r){var a=r(64836),n=r(18698);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var u=a(r(42122)),f=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==n(e)&&"function"!=typeof e)return{default:e};var r=o(t);if(r&&r.has(e))return r.get(e);var a={},u=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var f in e)if("default"!==f&&Object.prototype.hasOwnProperty.call(e,f)){var l=u?Object.getOwnPropertyDescriptor(e,f):null;l&&(l.get||l.set)?Object.defineProperty(a,f,l):a[f]=e[f]}return a.default=e,r&&r.set(e,a),a}(r(67294)),l=a(r(98696)),c=a(r(92074));function o(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(o=function(e){return e?r:t})(e)}var i=function(e,t){return f.createElement(c.default,(0,u.default)((0,u.default)({},e),{},{ref:t,icon:l.default}))};i.displayName="BellOutlined";var d=f.forwardRef(i);t.default=d}}]);

1
static/web/_next/static/chunks/1008.65d0bc27255efb44.js vendored

@ -0,0 +1 @@ @@ -0,0 +1 @@
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1008],{98696:function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M816 768h-24V428c0-141.1-104.3-257.7-240-277.1V112c0-22.1-17.9-40-40-40s-40 17.9-40 40v38.9c-135.7 19.4-240 136-240 277.1v340h-24c-17.7 0-32 14.3-32 32v32c0 4.4 3.6 8 8 8h216c0 61.8 50.2 112 112 112s112-50.2 112-112h216c4.4 0 8-3.6 8-8v-32c0-17.7-14.3-32-32-32zM512 888c-26.5 0-48-21.5-48-48h96c0 26.5-21.5 48-48 48zM304 768V428c0-55.6 21.6-107.8 60.9-147.1S456.4 220 512 220c55.6 0 107.8 21.6 147.1 60.9S720 372.4 720 428v340H304z"}}]},name:"bell",theme:"outlined"}},11008:function(e,t,r){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var u=_interopRequireDefault(r(25594));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}t.default=u,e.exports=u},25594:function(e,t,r){var u=r(64836),a=r(18698);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=u(r(42122)),l=_interopRequireWildcard(r(67294)),i=u(r(98696)),c=u(r(92074));function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(_getRequireWildcardCache=function(e){return e?r:t})(e)}function _interopRequireWildcard(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==a(e)&&"function"!=typeof e)return{default:e};var r=_getRequireWildcardCache(t);if(r&&r.has(e))return r.get(e);var u={},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var l in e)if("default"!==l&&Object.prototype.hasOwnProperty.call(e,l)){var i=n?Object.getOwnPropertyDescriptor(e,l):null;i&&(i.get||i.set)?Object.defineProperty(u,l,i):u[l]=e[l]}return u.default=e,r&&r.set(e,u),u}var BellOutlined=function(e,t){return l.createElement(c.default,(0,n.default)((0,n.default)({},e),{},{ref:t,icon:i.default}))};BellOutlined.displayName="BellOutlined";var f=l.forwardRef(BellOutlined);t.default=f}}]);

1
static/web/_next/static/chunks/1010.398d7f6d64350bec.js vendored

@ -0,0 +1 @@ @@ -0,0 +1 @@
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1010],{90034:function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default={icon:function(e,t){return{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M180 292h80v440h-80zm369 180h-74a3 3 0 00-3 3v74a3 3 0 003 3h74a3 3 0 003-3v-74a3 3 0 00-3-3zm215-108h80v296h-80z",fill:t}},{tag:"path",attrs:{d:"M904 296h-66v-96c0-4.4-3.6-8-8-8h-52c-4.4 0-8 3.6-8 8v96h-66c-4.4 0-8 3.6-8 8v416c0 4.4 3.6 8 8 8h66v96c0 4.4 3.6 8 8 8h52c4.4 0 8-3.6 8-8v-96h66c4.4 0 8-3.6 8-8V304c0-4.4-3.6-8-8-8zm-60 364h-80V364h80v296zM612 404h-66V232c0-4.4-3.6-8-8-8h-52c-4.4 0-8 3.6-8 8v172h-66c-4.4 0-8 3.6-8 8v200c0 4.4 3.6 8 8 8h66v172c0 4.4 3.6 8 8 8h52c4.4 0 8-3.6 8-8V620h66c4.4 0 8-3.6 8-8V412c0-4.4-3.6-8-8-8zm-60 145a3 3 0 01-3 3h-74a3 3 0 01-3-3v-74a3 3 0 013-3h74a3 3 0 013 3v74zM320 224h-66v-56c0-4.4-3.6-8-8-8h-52c-4.4 0-8 3.6-8 8v56h-66c-4.4 0-8 3.6-8 8v560c0 4.4 3.6 8 8 8h66v56c0 4.4 3.6 8 8 8h52c4.4 0 8-3.6 8-8v-56h66c4.4 0 8-3.6 8-8V232c0-4.4-3.6-8-8-8zm-60 508h-80V292h80v440z",fill:e}}]}},name:"sliders",theme:"twotone"}},71010:function(e,t,r){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var a=_interopRequireDefault(r(54626));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}t.default=a,e.exports=a},54626:function(e,t,r){var a=r(64836),c=r(18698);Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=a(r(42122)),u=_interopRequireWildcard(r(67294)),i=a(r(90034)),o=a(r(92074));function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,r=new WeakMap;return(_getRequireWildcardCache=function(e){return e?r:t})(e)}function _interopRequireWildcard(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==c(e)&&"function"!=typeof e)return{default:e};var r=_getRequireWildcardCache(t);if(r&&r.has(e))return r.get(e);var a={},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&Object.prototype.hasOwnProperty.call(e,u)){var i=n?Object.getOwnPropertyDescriptor(e,u):null;i&&(i.get||i.set)?Object.defineProperty(a,u,i):a[u]=e[u]}return a.default=e,r&&r.set(e,a),a}var SlidersTwoTone=function(e,t){return u.createElement(o.default,(0,n.default)((0,n.default)({},e),{},{ref:t,icon:i.default}))};SlidersTwoTone.displayName="SlidersTwoTone";var l=u.forwardRef(SlidersTwoTone);t.default=l}}]);

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save