]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Add option to download subtitles in download modal
authorRigel Kent <sendmemail@rigelk.eu>
Tue, 7 Jan 2020 15:53:57 +0000 (16:53 +0100)
committerChocobozzz <chocobozzz@cpy.re>
Tue, 7 Jan 2020 16:09:21 +0000 (17:09 +0100)
client/src/app/shared/video/modals/video-download.component.html
client/src/app/shared/video/modals/video-download.component.scss
client/src/app/shared/video/modals/video-download.component.ts
client/src/app/shared/video/video-actions-dropdown.component.ts
client/src/app/videos/+video-watch/video-watch.component.html

index 3619f24e509a4bbc037458905bc6057dfea84033..ed61198c42f1d4bbfcb080e429607434d64ec5ee 100644 (file)
@@ -1,6 +1,17 @@
 <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>
 
@@ -8,9 +19,12 @@
     <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">
@@ -21,7 +35,7 @@
       </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>
index 3e826c3b6c89c5aef2935b0e1c425dc1d36037ea..09dd91aa95cb62b5df4f315416f5bc19eb1616cc 100644 (file)
   }
 }
 
+#dropdownDownloadType {
+  cursor: pointer;
+}
+
 .download-type {
   margin-top: 30px;
 
index 71274008648b92c858dba599754091ae89968f65..c1ceca26325974a1e43b10b101e52508b1e9d55f 100644 (file)
@@ -3,7 +3,9 @@ import { VideoDetails } from '../../../shared/video/video-details.model'
 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',
@@ -15,10 +17,14 @@ export class VideoDownloadComponent {
 
   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,
@@ -26,22 +32,31 @@ export class VideoDownloadComponent {
     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 () {
@@ -50,6 +65,12 @@ export class VideoDownloadComponent {
   }
 
   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)
 
@@ -72,7 +93,15 @@ export class VideoDownloadComponent {
     }
   }
 
+  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
+  }
 }
index 80407098b4bc5d3e2afcc8f537ad8e72814ca655..afdeab18d819e5c3ff9b7cef886044b4a988610c 100644 (file)
@@ -13,6 +13,7 @@ import { VideoReportComponent } from '@app/shared/video/modals/video-report.comp
 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
@@ -37,6 +38,7 @@ export class VideoActionsDropdownComponent implements OnChanges {
   @ViewChild('videoBlacklistModal', { static: false }) videoBlacklistModal: VideoBlacklistComponent
 
   @Input() video: Video | VideoDetails
+  @Input() videoCaptions: VideoCaption[] = []
 
   @Input() displayOptions: VideoActionsDisplayType = {
     playlist: false,
@@ -105,7 +107,7 @@ export class VideoActionsDropdownComponent implements OnChanges {
   showDownloadModal () {
     this.modalOpened.emit()
 
-    this.videoDownloadModal.show(this.video as VideoDetails)
+    this.videoDownloadModal.show(this.video as VideoDetails, this.videoCaptions)
   }
 
   showReportModal () {
index 246eac2dd868f1943dd8862d29734c35edc62641..908611ddfe61790c484a2c94f412ed8e3893ba74 100644 (file)
                   </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>