178 lines
5.6 KiB
Vue
178 lines
5.6 KiB
Vue
<template>
|
|
<tab
|
|
:label="$gettext('HLS')"
|
|
:item-header-class="tabClassWithBackend"
|
|
>
|
|
<form-fieldset v-if="isBackendEnabled">
|
|
<template #label>
|
|
{{ $gettext('HTTP Live Streaming (HLS)') }}
|
|
</template>
|
|
<template #description>
|
|
{{
|
|
$gettext('HTTP Live Streaming (HLS) is a new adaptive-bitrate technology supported by some clients. It does not use the standard broadcasting frontends.')
|
|
}}
|
|
</template>
|
|
|
|
<div class="row g-3 mb-3">
|
|
<form-group-checkbox
|
|
id="edit_form_enable_hls"
|
|
class="col-md-12"
|
|
:field="v$.enable_hls"
|
|
:label="$gettext('Enable HTTP Live Streaming (HLS)')"
|
|
/>
|
|
</div>
|
|
|
|
<div
|
|
v-if="form.enable_hls"
|
|
class="row g-3 mb-3"
|
|
>
|
|
<form-group-checkbox
|
|
id="edit_form_backend_hls_enable_on_public_player"
|
|
class="col-md-12"
|
|
:field="v$.backend_config.hls_enable_on_public_player"
|
|
:label="$gettext('Show HLS Stream on Public Player')"
|
|
/>
|
|
|
|
<form-group-checkbox
|
|
id="edit_form_backend_hls_is_default"
|
|
class="col-md-12"
|
|
:field="v$.backend_config.hls_is_default"
|
|
:label="$gettext('Make HLS Stream Default in Public Player')"
|
|
/>
|
|
</div>
|
|
|
|
<div
|
|
v-if="enableAdvancedFeatures && form.enable_hls"
|
|
class="row g-3 mb-3"
|
|
>
|
|
<form-group-field
|
|
id="edit_form_backend_hls_segment_length"
|
|
class="col-md-4"
|
|
:field="v$.backend_config.hls_segment_length"
|
|
input-type="number"
|
|
:input-attrs="{ min: '0', max: '9999' }"
|
|
advanced
|
|
:label="$gettext('Segment Length (Seconds)')"
|
|
/>
|
|
|
|
<form-group-field
|
|
id="edit_form_backend_hls_segments_in_playlist"
|
|
class="col-md-4"
|
|
:field="v$.backend_config.hls_segments_in_playlist"
|
|
input-type="number"
|
|
:input-attrs="{ min: '0', max: '60' }"
|
|
advanced
|
|
:label="$gettext('Segments in Playlist')"
|
|
/>
|
|
|
|
<form-group-field
|
|
id="edit_form_backend_hls_segments_overhead"
|
|
class="col-md-4"
|
|
:field="v$.backend_config.hls_segments_overhead"
|
|
input-type="number"
|
|
:input-attrs="{ min: '0', max: '60' }"
|
|
advanced
|
|
:label="$gettext('Segments Overhead')"
|
|
/>
|
|
</div>
|
|
</form-fieldset>
|
|
<backend-disabled v-else />
|
|
</tab>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import FormFieldset from "~/components/Form/FormFieldset.vue";
|
|
import FormGroupField from "~/components/Form/FormGroupField.vue";
|
|
import {BackendAdapter} from "~/entities/RadioAdapters";
|
|
import FormGroupCheckbox from "~/components/Form/FormGroupCheckbox.vue";
|
|
import BackendDisabled from "./Common/BackendDisabled.vue";
|
|
import {computed} from "vue";
|
|
import {useVModel} from "@vueuse/core";
|
|
import {useVuelidateOnFormTab} from "~/functions/useVuelidateOnFormTab";
|
|
import {numeric} from "@vuelidate/validators";
|
|
import {useAzuraCast} from "~/vendor/azuracast";
|
|
import Tab from "~/components/Common/Tab.vue";
|
|
|
|
const props = defineProps({
|
|
form: {
|
|
type: Object,
|
|
required: true
|
|
},
|
|
station: {
|
|
type: Object,
|
|
required: true
|
|
}
|
|
});
|
|
|
|
const {enableAdvancedFeatures} = useAzuraCast();
|
|
|
|
const emit = defineEmits(['update:form']);
|
|
const form = useVModel(props, 'form', emit);
|
|
|
|
const {v$, tabClass} = useVuelidateOnFormTab(
|
|
computed(() => {
|
|
let validations: {
|
|
[key: string | number]: any
|
|
} = {
|
|
enable_hls: {},
|
|
backend_config: {
|
|
hls_enable_on_public_player: {},
|
|
hls_is_default: {},
|
|
},
|
|
};
|
|
|
|
if (enableAdvancedFeatures) {
|
|
validations = {
|
|
...validations,
|
|
backend_config: {
|
|
...validations.backend_config,
|
|
hls_segment_length: {numeric},
|
|
hls_segments_in_playlist: {numeric},
|
|
hls_segments_overhead: {numeric},
|
|
},
|
|
};
|
|
}
|
|
|
|
return validations;
|
|
}),
|
|
form,
|
|
() => {
|
|
let blankForm: {
|
|
[key: string | number]: any
|
|
} = {
|
|
enable_hls: false,
|
|
backend_config: {
|
|
hls_enable_on_public_player: false,
|
|
hls_is_default: false,
|
|
}
|
|
};
|
|
|
|
if (enableAdvancedFeatures) {
|
|
blankForm = {
|
|
...blankForm,
|
|
backend_config: {
|
|
...blankForm.backend_config,
|
|
hls_segment_length: 4,
|
|
hls_segments_in_playlist: 5,
|
|
hls_segments_overhead: 2,
|
|
}
|
|
};
|
|
}
|
|
|
|
return blankForm;
|
|
},
|
|
);
|
|
|
|
const isBackendEnabled = computed(() => {
|
|
return form.value.backend_type !== BackendAdapter.None;
|
|
});
|
|
|
|
const tabClassWithBackend = computed(() => {
|
|
if (tabClass.value) {
|
|
return tabClass.value;
|
|
}
|
|
|
|
return (isBackendEnabled.value) ? null : 'text-muted';
|
|
});
|
|
</script>
|