<ng-template #modal let-hide="close">
<div class="modal-header">
- <h4 i18n class="modal-title">Download video</h4>
+ <h4 i18n class="modal-title">Download
+ <span *ngIf="!videoCaptions" i18n>video</span>
+ <div *ngIf="videoCaptions" ngbDropdown class="d-inline-block">
+ <span id="dropdownDownloadType" ngbDropdownToggle i18n>
+ {{ type }}
+ </span>
+ <div ngbDropdownMenu aria-labelledby="dropdownDownloadType">
+ <button *ngIf="type === 'video'" (click)="switchToType('subtitles')" ngbDropdownItem i18n>subtitles</button>
+ <button *ngIf="type === 'subtitles'" (click)="switchToType('video')" ngbDropdownItem i18n>video</button>
+ </div>
+ </div>
+ </h4>
<my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
</div>
<div class="form-group">
<div class="input-group input-group-sm">
<div class="input-group-prepend peertube-select-container">
- <select [(ngModel)]="resolutionId">
+ <select *ngIf="type === 'video'" [(ngModel)]="resolutionId">
<option *ngFor="let file of getVideoFiles()" [value]="file.resolution.id">{{ file.resolution.label }}</option>
</select>
+ <select *ngIf="type === 'subtitles'" [(ngModel)]="subtitleLanguageId">
+ <option *ngFor="let caption of videoCaptions" [value]="caption.language.id">{{ caption.language.label }}</option>
+ </select>
</div>
<input #urlInput (click)="urlInput.select()" type="text" class="form-control input-sm readonly" readonly [value]="getLink()" />
<div class="input-group-append">
</div>
</div>
- <div class="download-type">
+ <div class="download-type" *ngIf="type === 'video'">
<div class="peertube-radio-container">
<input type="radio" name="download" id="download-direct" [(ngModel)]="downloadType" value="direct">
<label i18n for="download-direct">Direct download</label>
}
}
+#dropdownDownloadType {
+ cursor: pointer;
+}
+
.download-type {
margin-top: 30px;
import { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { I18n } from '@ngx-translate/i18n-polyfill'
import { AuthService, Notifier } from '@app/core'
-import { VideoPrivacy } from '@shared/models'
+import { VideoPrivacy, VideoCaption } from '@shared/models'
+
+type DownloadType = 'video' | 'subtitles'
@Component({
selector: 'my-video-download',
downloadType: 'direct' | 'torrent' = 'torrent'
resolutionId: number | string = -1
+ subtitleLanguageId: string
video: VideoDetails
+ videoCaptions: VideoCaption[]
activeModal: NgbActiveModal
+ type: DownloadType = 'video'
+
constructor (
private notifier: Notifier,
private modalService: NgbModal,
private i18n: I18n
) { }
+ get typeText () {
+ return this.type === 'video'
+ ? this.i18n('video')
+ : this.i18n('subtitles')
+ }
+
getVideoFiles () {
if (!this.video) return []
return this.video.getFiles()
}
- show (video: VideoDetails) {
+ show (video: VideoDetails, videoCaptions?: VideoCaption[]) {
this.video = video
+ this.videoCaptions = videoCaptions && videoCaptions.length ? videoCaptions : undefined
this.activeModal = this.modalService.open(this.modal)
this.resolutionId = this.getVideoFiles()[0].resolution.id
+ if (this.videoCaptions) this.subtitleLanguageId = this.videoCaptions[0].language.id
}
onClose () {
this.video = undefined
+ this.videoCaptions = undefined
}
download () {
}
getLink () {
+ return this.type === 'subtitles' && this.videoCaptions
+ ? this.getSubtitlesLink()
+ : this.getVideoLink()
+ }
+
+ getVideoLink () {
// HTML select send us a string, so convert it to a number
this.resolutionId = parseInt(this.resolutionId.toString(), 10)
}
}
+ getSubtitlesLink () {
+ return window.location.origin + this.videoCaptions.find(caption => caption.language.id === this.subtitleLanguageId).captionPath
+ }
+
activateCopiedMessage () {
this.notifier.success(this.i18n('Copied'))
}
+
+ switchToType (type: DownloadType) {
+ this.type = type
+ }
}
import { VideoBlacklistComponent } from '@app/shared/video/modals/video-blacklist.component'
import { VideoBlacklistService } from '@app/shared/video-blacklist'
import { ScreenService } from '@app/shared/misc/screen.service'
+import { VideoCaption } from '@shared/models'
export type VideoActionsDisplayType = {
playlist?: boolean
@ViewChild('videoBlacklistModal', { static: false }) videoBlacklistModal: VideoBlacklistComponent
@Input() video: Video | VideoDetails
+ @Input() videoCaptions: VideoCaption[] = []
@Input() displayOptions: VideoActionsDisplayType = {
playlist: false,
showDownloadModal () {
this.modalOpened.emit()
- this.videoDownloadModal.show(this.video as VideoDetails)
+ this.videoDownloadModal.show(this.video as VideoDetails, this.videoCaptions)
}
showReportModal () {
</div>
<my-video-actions-dropdown
- placement="bottom auto" buttonDirection="horizontal" [buttonStyled]="true" [video]="video"
+ placement="bottom auto" buttonDirection="horizontal" [buttonStyled]="true" [video]="video" [videoCaptions]="videoCaptions"
(videoRemoved)="onVideoRemoved()" (modalOpened)="onModalOpened()"
></my-video-actions-dropdown>
</div>