Add "auto-generated" caption info

pull/6527/head
Chocobozzz 2024-07-10 12:31:34 +02:00
parent c5de5ef1d0
commit 5d62c3c1cb
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
9 changed files with 30 additions and 8 deletions

View File

@ -184,7 +184,7 @@
<a <a
i18n-title title="See the subtitle file" class="caption-entry-label" target="_blank" rel="noopener noreferrer" i18n-title title="See the subtitle file" class="caption-entry-label" target="_blank" rel="noopener noreferrer"
[href]="videoCaption.captionPath" [href]="videoCaption.captionPath"
>{{ videoCaption.language.label }}</a> >{{ getCaptionLabel(videoCaption) }}</a>
<div i18n class="caption-entry-state">Already uploaded on {{ videoCaption.updatedAt | date }} &#10004;</div> <div i18n class="caption-entry-state">Already uploaded on {{ videoCaption.updatedAt | date }} &#10004;</div>
@ -193,7 +193,7 @@
</ng-container> </ng-container>
<ng-container *ngIf="videoCaption.action === 'CREATE'"> <ng-container *ngIf="videoCaption.action === 'CREATE'">
<span class="caption-entry-label">{{ videoCaption.language.label }}</span> <span class="caption-entry-label">{{ getCaptionLabel(videoCaption) }}</span>
<div i18n class="caption-entry-state caption-entry-state-create">Will be created on update</div> <div i18n class="caption-entry-state caption-entry-state-create">Will be created on update</div>
@ -201,7 +201,7 @@
</ng-container> </ng-container>
<ng-container *ngIf="videoCaption.action === 'UPDATE'"> <ng-container *ngIf="videoCaption.action === 'UPDATE'">
<span class="caption-entry-label">{{ videoCaption.language.label }}</span> <span class="caption-entry-label">{{ getCaptionLabel(videoCaption) }}</span>
<div i18n class="caption-entry-state caption-entry-state-create">Will be edited on update</div> <div i18n class="caption-entry-state caption-entry-state-create">Will be edited on update</div>
@ -209,7 +209,7 @@
</ng-container> </ng-container>
<ng-container *ngIf="videoCaption.action === 'REMOVE'"> <ng-container *ngIf="videoCaption.action === 'REMOVE'">
<span class="caption-entry-label">{{ videoCaption.language.label }}</span> <span class="caption-entry-label">{{ getCaptionLabel(videoCaption) }}</span>
<div i18n class="caption-entry-state caption-entry-state-delete">Will be deleted on update</div> <div i18n class="caption-entry-state caption-entry-state-delete">Will be deleted on update</div>

View File

@ -348,6 +348,14 @@ export class VideoEditComponent implements OnInit, OnDestroy {
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
getCaptionLabel (caption: VideoCaptionWithPathEdit) {
if (caption.automaticallyGenerated) {
return $localize`${caption.language.label} (auto-generated)`
}
return caption.language.label
}
getExistingCaptions () { getExistingCaptions () {
return this.videoCaptions return this.videoCaptions
.filter(c => c.action !== 'REMOVE') .filter(c => c.action !== 'REMOVE')

View File

@ -768,6 +768,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
const playerCaptions = videoCaptions.map(c => ({ const playerCaptions = videoCaptions.map(c => ({
label: c.language.label, label: c.language.label,
language: c.language.id, language: c.language.id,
automaticallyGenerated: c.automaticallyGenerated,
src: environment.apiUrl + c.captionPath src: environment.apiUrl + c.captionPath
})) }))

View File

@ -4,6 +4,8 @@ export interface VideoCaptionEdit {
label?: string label?: string
} }
automaticallyGenerated?: boolean
action?: 'CREATE' | 'REMOVE' | 'UPDATE' action?: 'CREATE' | 'REMOVE' | 'UPDATE'
captionfile?: any captionfile?: any
updatedAt?: string updatedAt?: string

View File

@ -26,7 +26,11 @@
<div ngbNav #subtitleNav="ngbNav" class="nav-tabs" [activeId]="subtitleLanguageId" (activeIdChange)="onSubtitleIdChange($event)"> <div ngbNav #subtitleNav="ngbNav" class="nav-tabs" [activeId]="subtitleLanguageId" (activeIdChange)="onSubtitleIdChange($event)">
<ng-container *ngFor="let caption of getCaptions()" [ngbNavItem]="caption.language.id"> <ng-container *ngFor="let caption of getCaptions()" [ngbNavItem]="caption.language.id">
<a ngbNavLink i18n>{{ caption.language.label }}</a> <a ngbNavLink>
{{ caption.language.label }}
<ng-container *ngIf="caption.automaticallyGenerated" i18n>(auto-generated)</ng-container>
</a>
<ng-template ngbNavContent> <ng-template ngbNavContent>
<div class="nav-content"> <div class="nav-content">
@ -53,8 +57,8 @@
</ng-template> </ng-template>
<ng-container *ngIf="originalVideoFile" ngbNavItem="original"> <ng-container *ngIf="originalVideoFile" ngbNavItem="original">
<a ngbNavLink i18n> <a ngbNavLink>
<ng-container>Original file</ng-container> <ng-container i18n>Original file</ng-container>
<my-global-icon ngbTooltip="Other users cannot download the original file" iconName="shield"></my-global-icon> <my-global-icon ngbTooltip="Other users cannot download the original file" iconName="shield"></my-global-icon>
</a> </a>

View File

@ -506,7 +506,11 @@ class PeerTubePlugin extends Plugin {
for (const caption of this.options.videoCaptions()) { for (const caption of this.options.videoCaptions()) {
this.player.addRemoteTextTrack({ this.player.addRemoteTextTrack({
kind: 'captions', kind: 'captions',
label: caption.label,
label: caption.automaticallyGenerated
? this.player.localize('{1} (auto-generated)', [ caption.label ])
: caption.label,
language: caption.language, language: caption.language,
id: caption.language, id: caption.language,
src: caption.src, src: caption.src,

View File

@ -98,6 +98,7 @@ type VideoJSCaption = {
label: string label: string
language: string language: string
src: string src: string
automaticallyGenerated: boolean
} }
type VideoJSStoryboard = { type VideoJSStoryboard = {

View File

@ -425,6 +425,7 @@ export class PlayerOptionsBuilder {
return data.map((c: VideoCaption) => ({ return data.map((c: VideoCaption) => ({
label: peertubeTranslate(c.language.label, translations), label: peertubeTranslate(c.language.label, translations),
language: c.language.id, language: c.language.id,
automaticallyGenerated: c.automaticallyGenerated,
src: window.location.origin + c.captionPath src: window.location.origin + c.captionPath
})) }))
} }

View File

@ -81,6 +81,7 @@ const playerKeys = {
'{1} (from edge: {2})': '{1} (from edge: {2})', '{1} (from edge: {2})': '{1} (from edge: {2})',
'Disable subtitles': 'Disable subtitles', 'Disable subtitles': 'Disable subtitles',
'Enable {1} subtitle': 'Enable {1} subtitle', 'Enable {1} subtitle': 'Enable {1} subtitle',
'{1} (auto-generated)': '{1} (auto-generated)',
'Go back': 'Go back' 'Go back': 'Go back'
} }
Object.assign(playerKeys, videojs) Object.assign(playerKeys, videojs)