<div class="video-edit" [formGroup]="form">
<div ngbNav #nav="ngbNav" class="nav-tabs">
+ <ng-template #pluginSettingTemplate let-pluginSetting>
+ <div class="form-group" [hidden]="isPluginFieldHidden(pluginSetting)">
+ <my-dynamic-form-field [form]="pluginDataFormGroup" [formErrors]="formErrors['pluginData']" [setting]="pluginSetting.commonOptions"></my-dynamic-form-field>
+ </div>
+ </ng-template>
+
<ng-container ngbNavItem>
<a ngbNavLink i18n>Basic info</a>
<ng-template ngbNavContent>
- <div class="row">
+ <div class="form-columns">
<div class="col-video-edit">
<div class="form-group">
<label i18n for="name">Title</label>
</ng-template>
</my-help>
- <my-markdown-textarea [truncate]="250" formControlName="description" [markdownVideo]="true"></my-markdown-textarea>
+ <my-markdown-textarea [truncate]="250" formControlName="description" [markdownVideo]="videoToUpdate"></my-markdown-textarea>
<div *ngIf="formErrors.description" class="form-error">
{{ formErrors.description }}
<my-help>
<ng-template ptTemplate="customHtml">
<ng-container i18n>
- <a href="https://chooser-beta.creativecommons.org/" target="_blank" rel="noopener noreferrer">Choose</a> the appropriate license for your work.
+ <a href="https://chooser-beta.creativecommons.org/" target="_blank" rel="noopener noreferrer">Choose</a> the appropriate licence for your work.
</ng-container>
</ng-template>
</my-help>
<label i18n for="schedulePublicationAt">Schedule publication ({{ calendarTimezone }})</label>
<p-calendar
id="schedulePublicationAt" formControlName="schedulePublicationAt" [dateFormat]="calendarDateFormat"
- [locale]="calendarLocale" [minDate]="minScheduledDate" [showTime]="true" [hideOnDateTimeSelect]="true"
+ [firstDayOfWeek]="0" [minDate]="minScheduledDate" [showTime]="true" [hideOnDateTimeSelect]="true"
>
</p-calendar>
</ng-template>
<ng-template ptTemplate="help">
- <ng-container i18n>Some instances do not list videos containing mature or explicit content by default.</ng-container>
+ <ng-container i18n>Some instances hide videos containing mature or explicit content by default.</ng-container>
</ng-template>
</my-peertube-checkbox>
- <my-peertube-checkbox *ngIf="isWaitTranscodingDisplayed()" inputName="waitTranscoding" formControlName="waitTranscoding" helpPlacement="bottom-right">
+ <my-peertube-checkbox *ngIf="waitTranscodingEnabled" inputName="waitTranscoding" formControlName="waitTranscoding" helpPlacement="bottom-right">
<ng-template ptTemplate="label">
<ng-container i18n>Publish after transcoding</ng-container>
</ng-template>
</ng-template>
</my-peertube-checkbox>
+ <ng-container
+ *ngFor="let pluginSetting of getPluginsFields('main')"
+ [ngTemplateOutlet]="pluginSettingTemplate" [ngTemplateOutletContext]="{ $implicit: pluginSetting }"
+ >
+ </ng-container>
</div>
</div>
</ng-template>
<div i18n class="caption-entry-state">Already uploaded ✔</div>
+ <span i18n class="caption-entry-edit" (click)="videoCaptionEditModal.show()">Edit</span>
<span i18n class="caption-entry-delete" (click)="deleteCaption(videoCaption)">Delete</span>
</ng-container>
<span i18n class="caption-entry-delete" (click)="deleteCaption(videoCaption)">Cancel create</span>
</ng-container>
+ <ng-container *ngIf="videoCaption.action === 'UPDATE'">
+ <span class="caption-entry-label">{{ videoCaption.language.label }}</span>
+
+ <div i18n class="caption-entry-state caption-entry-state-create">Will be edited on update</div>
+
+ <span i18n class="caption-entry-delete" (click)="deleteCaption(videoCaption)">Cancel edition</span>
+ </ng-container>
+
<ng-container *ngIf="videoCaption.action === 'REMOVE'">
<span class="caption-entry-label">{{ videoCaption.language.label }}</span>
<span i18n class="caption-entry-delete" (click)="deleteCaption(videoCaption)">Cancel deletion</span>
</ng-container>
+
+ <my-video-caption-edit-modal
+ #videoCaptionEditModal
+ [videoCaption]="videoCaption"
+ [serverConfig]="serverConfig"
+ (captionEdited)="onCaptionEdited($event)"
+ ></my-video-caption-edit-modal>
</div>
</div>
<ng-template ngbNavContent>
<div class="row live-settings">
<div class="col-md-12">
+ <div class="alert pt-alert-primary">
+ <my-live-documentation-link></my-live-documentation-link>
+ </div>
- <div class="form-group">
+ <div *ngIf="liveVideo.rtmpUrl" class="form-group">
<label for="liveVideoRTMPUrl" i18n>Live RTMP Url</label>
- <my-input-readonly-copy id="liveVideoRTMPUrl" [value]="liveVideo.rtmpUrl"></my-input-readonly-copy>
+ <my-input-text inputId="liveVideoRTMPUrl" [value]="liveVideo.rtmpUrl" [withToggle]="false" [withCopy]="true" [show]="true" [readonly]="true"></my-input-text>
+ </div>
+
+ <div *ngIf="liveVideo.rtmpsUrl" class="form-group">
+ <label for="liveVideoRTMPSUrl" i18n>Live RTMPS Url</label>
+ <my-input-text inputId="liveVideoRTMPSUrl" [value]="liveVideo.rtmpsUrl" [withToggle]="false" [withCopy]="true" [show]="true" [readonly]="true"></my-input-text>
</div>
<div class="form-group">
<label for="liveVideoStreamKey" i18n>Live stream key</label>
- <my-input-readonly-copy id="liveVideoStreamKey" [value]="liveVideo.streamKey"></my-input-readonly-copy>
+ <my-input-text inputId="liveVideoStreamKey" [value]="liveVideo.streamKey" [withCopy]="true" [readonly]="true"></my-input-text>
<div class="form-group-description" i18n>⚠️ Never share your stream key with anyone.</div>
</div>
+ <div class="form-group">
+ <div class="peertube-radio-container">
+ <input type="radio" formControlName="permanentLive" id="permanentLiveFalse" [value]="false">
+ <label i18n for="permanentLiveFalse" class="radio">This is a normal live</label>
+
+ <span class="form-group-description" i18n>
+ You can stream only once in a normal live. If you enable replay, it will be saved under the same URL as your live
+ </span>
+ </div>
+
+ <div class="peertube-radio-container">
+ <input type="radio" formControlName="permanentLive" id="permanentLiveTrue" [value]="true">
+ <label i18n for="permanentLiveTrue" class="radio">This is a permanent/recurring live</label>
+
+ <span class="form-group-description" i18n>
+ You can stream multiple times in a permanent/recurring live. If you enable replays, they will be saved as separate videos
+ </span>
+ </div>
+ </div>
+
<div class="form-group" *ngIf="isSaveReplayEnabled()">
<my-peertube-checkbox inputName="liveVideoSaveReplay" formControlName="saveReplay">
<ng-template ptTemplate="label">
</ng-container>
</my-peertube-checkbox>
</div>
+
+ <div class="form-group" *ngIf="isLatencyModeEnabled()">
+ <label i18n for="latencyMode">Latency mode</label>
+ <my-select-options
+ labelForId="latencyMode" [items]="latencyModes" formControlName="latencyMode" [clearable]="true"
+ ></my-select-options>
+
+ <div *ngIf="formErrors.latencyMode" class="form-error">
+ {{ formErrors.latencyMode }}
+ </div>
+ </div>
</div>
</div>
</ng-template>
</ng-template>
</my-help>
<p-calendar
- id="originallyPublishedAt" formControlName="originallyPublishedAt" [dateFormat]="calendarDateFormat"
- [locale]="calendarLocale" [showTime]="true" [hideOnDateTimeSelect]="true" [monthNavigator]="true" [yearNavigator]="true" [yearRange]="myYearRange"
+ id="originallyPublishedAt" formControlName="originallyPublishedAt" [dateFormat]="calendarDateFormat" [firstDayOfWeek]="0"
+ [showTime]="true" [hideOnDateTimeSelect]="true" [monthNavigator]="true" [yearNavigator]="true" [yearRange]="myYearRange"
>
</p-calendar>
</ng-template>
</ng-container>
- <ng-container ngbNavItem *ngIf="pluginFields.length !== 0">
+ <ng-container ngbNavItem *ngIf="getPluginsFields('plugin-settings').length !== 0">
<a ngbNavLink i18n>Plugin settings</a>
<ng-template ngbNavContent>
<div class="row plugin-settings">
<div class="col-md-12 col-xl-8">
- <div *ngFor="let pluginSetting of pluginFields" class="form-group">
- <my-dynamic-form-field [form]="pluginDataFormGroup" [formErrors]="formErrors" [setting]="pluginSetting.commonOptions"></my-dynamic-form-field>
- </div>
+ <ng-container
+ *ngFor="let pluginSetting of getPluginsFields('plugin-settings')"
+ [ngTemplateOutlet]="pluginSettingTemplate" [ngTemplateOutletContext]="{ $implicit: pluginSetting }"
+ >
+ </ng-container>
</div>
</div>
</div>
<my-video-caption-add-modal
- #videoCaptionAddModal [existingCaptions]="existingCaptions" [serverConfig]="serverConfig" (captionAdded)="onCaptionAdded($event)"
+ #videoCaptionAddModal [existingCaptions]="getExistingCaptions()" [serverConfig]="serverConfig" (captionAdded)="onCaptionEdited($event)"
></my-video-caption-add-modal>