2020-12-27 05:04:23 +03:00
// DEFAULT VALUES
2021-02-07 06:38:58 +03:00
import { fetchData , SERVER_CONFIG_UPDATE_URL } from './apis' ;
import { ApiPostArgs , VideoVariant , SocialHandle } from '../types/config-section' ;
2021-05-23 09:27:51 +03:00
import { TEXTFIELD_TYPE_URL } from '../components/config/form-textfield' ;
import { DEFAULT_TEXTFIELD_URL_PATTERN } from './urls' ;
2020-12-27 05:04:23 +03:00
2020-12-28 12:11:26 +03:00
export const TEXT_MAXLENGTH = 255 ;
2021-01-02 05:23:23 +03:00
export const RESET_TIMEOUT = 3000 ;
2021-01-17 06:46:19 +03:00
// CONFIG API ENDPOINTS
2021-01-28 14:08:57 +03:00
export const API_CUSTOM_CONTENT = '/pagecontent' ;
2021-04-12 10:07:08 +03:00
export const API_CUSTOM_CSS_STYLES = '/customstyles' ;
2021-01-28 14:08:57 +03:00
export const API_FFMPEG = '/ffmpegpath' ;
export const API_INSTANCE_URL = '/serverurl' ;
export const API_LOGO = '/logo' ;
export const API_NSFW_SWITCH = '/nsfw' ;
export const API_RTMP_PORT = '/rtmpserverport' ;
export const API_S3_INFO = '/s3' ;
export const API_SERVER_SUMMARY = '/serversummary' ;
2021-03-15 07:55:01 +03:00
export const API_SERVER_WELCOME_MESSAGE = '/welcomemessage' ;
2021-02-04 10:51:38 +03:00
export const API_SERVER_NAME = '/name' ;
2021-01-19 21:34:06 +03:00
export const API_SOCIAL_HANDLES = '/socialhandles' ;
2021-01-28 14:08:57 +03:00
export const API_STREAM_KEY = '/key' ;
export const API_STREAM_TITLE = '/streamtitle' ;
export const API_TAGS = '/tags' ;
export const API_USERNAME = '/name' ;
export const API_VIDEO_SEGMENTS = '/video/streamlatencylevel' ;
export const API_VIDEO_VARIANTS = '/video/streamoutputvariants' ;
export const API_WEB_PORT = '/webserverport' ;
export const API_YP_SWITCH = '/directoryenabled' ;
2021-03-14 21:39:07 +03:00
export const API_CHAT_DISABLE = '/chat/disable' ;
2021-05-02 07:05:04 +03:00
export const API_EXTERNAL_ACTIONS = '/externalactions' ;
2021-03-23 06:34:52 +03:00
export const API_VIDEO_CODEC = '/video/codec' ;
2021-01-28 14:08:57 +03:00
2021-01-03 11:26:26 +03:00
export async function postConfigUpdateToAPI ( args : ApiPostArgs ) {
2021-01-31 12:38:20 +03:00
const { apiPath , data , onSuccess , onError } = args ;
2021-01-03 11:26:26 +03:00
const result = await fetchData ( ` ${ SERVER_CONFIG_UPDATE_URL } ${ apiPath } ` , {
data ,
method : 'POST' ,
auth : true ,
} ) ;
if ( result . success && onSuccess ) {
2021-01-03 12:54:04 +03:00
onSuccess ( result . message ) ;
2021-01-03 11:26:26 +03:00
} else if ( onError ) {
2021-01-03 12:54:04 +03:00
onError ( result . message ) ;
2021-01-03 11:26:26 +03:00
}
}
2021-01-28 14:08:57 +03:00
// Some default props to help build out a TextField
2021-02-04 10:51:38 +03:00
export const TEXTFIELD_PROPS_SERVER_NAME = {
apiPath : API_SERVER_NAME ,
2021-03-25 00:12:22 +03:00
configPath : 'instanceDetails' ,
2021-01-28 14:08:57 +03:00
maxLength : TEXT_MAXLENGTH ,
placeholder : 'Owncast site name' , // like "gothland"
2021-02-03 10:59:33 +03:00
label : 'Name' ,
2021-01-28 14:08:57 +03:00
tip : 'The name of your Owncast server' ,
} ;
export const TEXTFIELD_PROPS_STREAM_TITLE = {
apiPath : API_STREAM_TITLE ,
2021-03-25 00:12:22 +03:00
configPath : 'instanceDetails' ,
2021-02-04 20:17:20 +03:00
maxLength : 100 ,
2021-01-28 14:08:57 +03:00
placeholder : 'Doing cool things...' ,
label : 'Stream Title' ,
tip : 'What is your stream about today?' ,
} ;
export const TEXTFIELD_PROPS_SERVER_SUMMARY = {
apiPath : API_SERVER_SUMMARY ,
2021-03-25 00:12:22 +03:00
configPath : 'instanceDetails' ,
2021-01-28 14:08:57 +03:00
maxLength : 500 ,
2021-02-03 10:59:33 +03:00
placeholder : '' ,
label : 'About' ,
tip : 'A brief blurb about you, your server, or what your stream is about.' ,
2021-01-28 14:08:57 +03:00
} ;
2021-03-15 07:55:01 +03:00
export const TEXTFIELD_PROPS_SERVER_WELCOME_MESSAGE = {
apiPath : API_SERVER_WELCOME_MESSAGE ,
2021-03-25 00:12:22 +03:00
configPath : 'instanceDetails' ,
2021-03-15 07:55:01 +03:00
maxLength : 500 ,
placeholder : '' ,
label : 'Welcome Message' ,
2021-05-23 09:28:21 +03:00
tip : 'A system chat message sent to viewers when they first connect to chat. Leave blank to disable.' ,
2021-03-15 07:55:01 +03:00
} ;
2021-01-28 14:08:57 +03:00
export const TEXTFIELD_PROPS_LOGO = {
apiPath : API_LOGO ,
2021-03-25 00:12:22 +03:00
configPath : 'instanceDetails' ,
2021-01-28 14:08:57 +03:00
maxLength : 255 ,
placeholder : '/img/mylogo.png' ,
label : 'Logo' ,
2021-05-23 09:28:21 +03:00
tip : 'Upload your logo if you have one. We recommend that you use a square image that is at least 256x256.' ,
2021-01-28 14:08:57 +03:00
} ;
export const TEXTFIELD_PROPS_STREAM_KEY = {
apiPath : API_STREAM_KEY ,
configPath : '' ,
maxLength : TEXT_MAXLENGTH ,
placeholder : 'abc123' ,
label : 'Stream Key' ,
2021-02-02 01:12:26 +03:00
tip : 'Save this key somewhere safe, you will need it to stream or login to the admin dashboard!' ,
2021-01-28 14:08:57 +03:00
required : true ,
} ;
export const TEXTFIELD_PROPS_FFMPEG = {
apiPath : API_FFMPEG ,
configPath : '' ,
maxLength : TEXT_MAXLENGTH ,
placeholder : '/usr/local/bin/ffmpeg' ,
label : 'FFmpeg Path' ,
tip : 'Absolute file path of the FFMPEG application on your server' ,
required : true ,
} ;
export const TEXTFIELD_PROPS_WEB_PORT = {
apiPath : API_WEB_PORT ,
configPath : '' ,
maxLength : 6 ,
placeholder : '8080' ,
2021-02-04 23:41:35 +03:00
label : 'Owncast port' ,
tip : 'What port is your Owncast web server listening? Default is 8080' ,
2021-01-28 14:08:57 +03:00
required : true ,
} ;
export const TEXTFIELD_PROPS_RTMP_PORT = {
apiPath : API_RTMP_PORT ,
configPath : '' ,
maxLength : 6 ,
placeholder : '1935' ,
label : 'RTMP port' ,
2021-02-04 23:41:35 +03:00
tip : 'What port should accept inbound broadcasts? Default is 1935' ,
2021-01-28 14:08:57 +03:00
required : true ,
} ;
export const TEXTFIELD_PROPS_INSTANCE_URL = {
apiPath : API_INSTANCE_URL ,
configPath : 'yp' ,
maxLength : 255 ,
placeholder : 'https://owncast.mysite.com' ,
2021-02-17 22:17:07 +03:00
label : 'Server URL' ,
2021-02-03 10:59:33 +03:00
tip : 'The full url to your Owncast server.' ,
2021-05-23 09:27:51 +03:00
type : TEXTFIELD_TYPE_URL ,
pattern : DEFAULT_TEXTFIELD_URL_PATTERN ,
useTrim : true ,
2021-01-28 14:08:57 +03:00
} ;
// MISC FIELDS
export const FIELD_PROPS_TAGS = {
apiPath : API_TAGS ,
configPath : 'instanceDetails' ,
maxLength : 24 ,
placeholder : 'Add a new tag' ,
required : true ,
label : '' ,
tip : '' ,
} ;
2021-01-03 11:26:26 +03:00
2021-01-28 14:08:57 +03:00
export const FIELD_PROPS_NSFW = {
apiPath : API_NSFW_SWITCH ,
configPath : 'instanceDetails' ,
label : 'NSFW?' ,
2021-05-23 09:28:21 +03:00
tip : "Turn this ON if you plan to steam explicit or adult content. Please respectfully set this flag so unexpected eyes won't accidentally see it in the Directory." ,
2021-01-28 14:08:57 +03:00
} ;
2021-01-03 15:03:18 +03:00
2021-01-28 14:08:57 +03:00
export const FIELD_PROPS_YP = {
apiPath : API_YP_SWITCH ,
configPath : 'yp' ,
2021-02-17 22:17:07 +03:00
label : 'Enable directory' ,
2021-02-27 10:44:13 +03:00
tip : 'Turn this ON if you want to show up in the directory.' ,
2021-01-28 14:08:57 +03:00
} ;
2020-12-29 13:51:56 +03:00
2021-01-31 12:38:20 +03:00
export const DEFAULT_VARIANT_STATE : VideoVariant = {
2021-01-10 13:37:22 +03:00
framerate : 24 ,
videoPassthrough : false ,
videoBitrate : 800 ,
audioPassthrough : true , // if false, then CAN set audiobitrate
audioBitrate : 0 ,
2021-01-31 09:53:00 +03:00
cpuUsageLevel : 3 ,
2021-02-08 04:03:02 +03:00
scaledHeight : null ,
scaledWidth : null ,
2021-03-12 00:39:36 +03:00
name : '' ,
2021-01-10 13:37:22 +03:00
} ;
2021-01-24 07:16:01 +03:00
2021-03-14 21:39:07 +03:00
export const FIELD_PROPS_DISABLE_CHAT = {
apiPath : API_CHAT_DISABLE ,
configPath : 'chatDisabled' ,
2021-05-02 07:04:24 +03:00
label : 'Hide chat' ,
2021-03-14 21:39:07 +03:00
tip : 'Hide the web chat interface.' ,
useSubmit : true ,
} ;
2021-02-27 10:44:13 +03:00
export const VIDEO_VARIANT_SETTING_DEFAULTS = {
// this one is currently unused
audioBitrate : {
min : 600 ,
max : 1200 ,
defaultValue : 800 ,
unit : 'kbps' ,
incrementBy : 100 ,
tip : 'nothing to see here' ,
} ,
videoPassthrough : {
tip : 'If enabled, all other settings will be disabled. Otherwise configure as desired.' ,
} ,
audioPassthrough : {
tip : 'If No is selected, then you should set your desired Audio Bitrate.' ,
} ,
scaledWidth : {
fieldName : 'scaledWidth' ,
label : 'Resized Width' ,
maxLength : 4 ,
placeholder : '1080' ,
tip : "Optionally resize this content's width." ,
} ,
scaledHeight : {
fieldName : 'scaledHeight' ,
label : 'Resized Height' ,
maxLength : 4 ,
placeholder : '720' ,
tip : "Optionally resize this content's height." ,
} ,
} ;
// VIDEO VARIANT FORM - framerate
export const FRAMERATE_DEFAULTS = {
min : 24 ,
max : 120 ,
defaultValue : 24 ,
unit : 'fps' ,
incrementBy : null ,
2021-05-23 09:28:21 +03:00
tip : 'Reducing your framerate will decrease the amount of video that needs to be encoded and sent to your viewers, saving CPU and bandwidth at the expense of smoothness. A lower value is generally is fine for most content.' ,
2021-02-27 10:44:13 +03:00
} ;
export const FRAMERATE_SLIDER_MARKS = {
[ FRAMERATE_DEFAULTS . min ] : ` ${ FRAMERATE_DEFAULTS . min } ${ FRAMERATE_DEFAULTS . unit } ` ,
30 : '' ,
60 : '' ,
90 : '' ,
[ FRAMERATE_DEFAULTS . max ] : ` ${ FRAMERATE_DEFAULTS . max } ${ FRAMERATE_DEFAULTS . unit } ` ,
} ;
export const FRAMERATE_TOOLTIPS = {
[ FRAMERATE_DEFAULTS . min ] : ` ${ FRAMERATE_DEFAULTS . min } fps - Good for film, presentations, music, low power/bandwidth servers. ` ,
30 : '30fps - Good for slow/casual games, chat, general purpose.' ,
60 : '60fps - Good for fast/action games, sports, HD video.' ,
90 : '90fps - Good for newer fast games and hardware.' ,
[ FRAMERATE_DEFAULTS . max ] : ` ${ FRAMERATE_DEFAULTS . max } fps - Experimental, use at your own risk! ` ,
} ;
// VIDEO VARIANT FORM - bitrate
export const VIDEO_BITRATE_DEFAULTS = {
2021-05-07 01:50:47 +03:00
min : 400 ,
2021-02-27 10:44:13 +03:00
max : 6000 ,
defaultValue : 1200 ,
unit : 'kbps' ,
incrementBy : 100 ,
tip : 'The overall quality of your stream is generally impacted most by bitrate.' ,
} ;
2021-03-12 00:39:36 +03:00
export const VIDEO_NAME_DEFAULTS = {
fieldName : 'name' ,
label : 'Name' ,
2021-05-23 09:27:51 +03:00
maxLength : 15 ,
2021-03-12 00:39:36 +03:00
placeholder : 'HD or Low' ,
2021-04-02 08:00:10 +03:00
tip : 'Human-readable name for for displaying in the player.' ,
2021-03-12 00:39:36 +03:00
} ;
2021-02-27 10:44:13 +03:00
export const VIDEO_BITRATE_SLIDER_MARKS = {
[ VIDEO_BITRATE_DEFAULTS . min ] : ` ${ VIDEO_BITRATE_DEFAULTS . min } ${ VIDEO_BITRATE_DEFAULTS . unit } ` ,
3000 : 3000 ,
4500 : 4500 ,
[ VIDEO_BITRATE_DEFAULTS . max ] : ` ${ VIDEO_BITRATE_DEFAULTS . max } ${ VIDEO_BITRATE_DEFAULTS . unit } ` ,
} ;
// VIDEO VARIANT FORM - encoder preset
// CPU
export const ENCODER_PRESET_SLIDER_MARKS = {
1 : 'lowest' ,
2 : '' ,
3 : '' ,
4 : '' ,
5 : 'highest' ,
} ;
export const ENCODER_PRESET_TOOLTIPS = {
2021-04-02 08:00:10 +03:00
1 : 'Lowest hardware usage - lowest quality video' ,
2 : 'Low hardware usage - low quality video' ,
3 : 'Medium hardware usage - average quality video' ,
4 : 'High hardware usage - high quality video' ,
5 : 'Highest hardware usage - higher quality video' ,
2021-02-27 10:44:13 +03:00
} ;
2021-01-31 12:38:20 +03:00
export const DEFAULT_SOCIAL_HANDLE : SocialHandle = {
2021-01-24 07:16:01 +03:00
url : '' ,
platform : '' ,
2021-01-24 12:22:28 +03:00
} ;
export const OTHER_SOCIAL_HANDLE_OPTION = 'OTHER_SOCIAL_HANDLE_OPTION' ;
2021-02-01 10:40:39 +03:00
export const TEXTFIELD_PROPS_S3_COMMON = {
maxLength : 255 ,
2021-02-05 01:50:03 +03:00
} ;
2021-02-01 10:40:39 +03:00
export const S3_TEXT_FIELDS_INFO = {
accessKey : {
fieldName : 'accessKey' ,
label : 'Access Key' ,
maxLength : 255 ,
placeholder : 'access key 123' ,
tip : '' ,
} ,
acl : {
fieldName : 'acl' ,
label : 'ACL' ,
maxLength : 255 ,
2021-02-02 02:20:26 +03:00
placeholder : '' ,
tip : 'Optional specific access control value to add to your content. Generally not required.' ,
2021-02-01 10:40:39 +03:00
} ,
bucket : {
fieldName : 'bucket' ,
label : 'Bucket' ,
maxLength : 255 ,
placeholder : 'bucket 123' ,
2021-02-02 02:20:26 +03:00
tip : 'Create a new bucket for each Owncast instance you may be running.' ,
2021-02-01 10:40:39 +03:00
} ,
endpoint : {
fieldName : 'endpoint' ,
label : 'Endpoint' ,
maxLength : 255 ,
2021-02-02 02:20:26 +03:00
placeholder : 'https://your.s3.provider.endpoint.com' ,
2021-05-23 09:27:51 +03:00
tip : 'The full URL (with "https://") endpoint from your storage provider.' ,
useTrim : true ,
type : TEXTFIELD_TYPE_URL ,
2021-05-23 09:28:21 +03:00
pattern : DEFAULT_TEXTFIELD_URL_PATTERN ,
2021-02-01 10:40:39 +03:00
} ,
region : {
fieldName : 'region' ,
label : 'Region' ,
maxLength : 255 ,
placeholder : 'region 123' ,
tip : '' ,
} ,
secret : {
fieldName : 'secret' ,
label : 'Secret key' ,
maxLength : 255 ,
2021-02-02 02:20:26 +03:00
placeholder : 'your secret key' ,
2021-02-01 10:40:39 +03:00
tip : '' ,
} ,
servingEndpoint : {
fieldName : 'servingEndpoint' ,
label : 'Serving Endpoint' ,
maxLength : 255 ,
2021-02-02 02:20:26 +03:00
placeholder : 'http://cdn.ss3.provider.endpoint.com' ,
2021-05-23 09:28:21 +03:00
tip : 'Optional URL that content should be accessed from instead of the default. Used with CDNs and specific storage providers. Generally not required.' ,
2021-05-23 09:27:51 +03:00
type : TEXTFIELD_TYPE_URL ,
pattern : DEFAULT_TEXTFIELD_URL_PATTERN ,
useTrim : true ,
2021-02-01 10:40:39 +03:00
} ,
} ;