]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - client/src/app/+videos/+video-edit/video-add-components/video-import-url.component.ts
Fix comments/download attributes on import
[github/Chocobozzz/PeerTube.git] / client / src / app / +videos / +video-edit / video-add-components / video-import-url.component.ts
index da25663d75eaae43d954ae20685ac5f22ac341e3..971a2a070edac6f3386aa91e79ffc16ad0a037bd 100644 (file)
@@ -1,14 +1,15 @@
+import { forkJoin } from 'rxjs'
 import { map, switchMap } from 'rxjs/operators'
-import { Component, EventEmitter, OnInit, Output } from '@angular/core'
+import { AfterViewInit, Component, EventEmitter, OnInit, Output } from '@angular/core'
 import { Router } from '@angular/router'
-import { AuthService, CanComponentDeactivate, Notifier, ServerService } from '@app/core'
-import { getAbsoluteAPIUrl, scrollToTop } from '@app/helpers'
+import { AuthService, CanComponentDeactivate, HooksService, Notifier, ServerService } from '@app/core'
+import { scrollToTop } from '@app/helpers'
 import { FormValidatorService } from '@app/shared/shared-forms'
 import { VideoCaptionService, VideoEdit, VideoImportService, VideoService } from '@app/shared/shared-main'
-import { VideoSend } from './video-send'
 import { LoadingBarService } from '@ngx-loading-bar/core'
-import { I18n } from '@ngx-translate/i18n-polyfill'
-import { VideoPrivacy, VideoUpdate } from '@shared/models'
+import { VideoUpdate } from '@shared/models'
+import { hydrateFormFromVideo } from '../shared/video-edit-utils'
+import { VideoSend } from './video-send'
 
 @Component({
   selector: 'my-video-import-url',
@@ -18,7 +19,7 @@ import { VideoPrivacy, VideoUpdate } from '@shared/models'
     './video-send.scss'
   ]
 })
-export class VideoImportUrlComponent extends VideoSend implements OnInit, CanComponentDeactivate {
+export class VideoImportUrlComponent extends VideoSend implements OnInit, AfterViewInit, CanComponentDeactivate {
   @Output() firstStepDone = new EventEmitter<string>()
   @Output() firstStepError = new EventEmitter<void>()
 
@@ -31,8 +32,6 @@ export class VideoImportUrlComponent extends VideoSend implements OnInit, CanCom
   video: VideoEdit
   error: string
 
-  protected readonly DEFAULT_VIDEO_PRIVACY = VideoPrivacy.PUBLIC
-
   constructor (
     protected formValidatorService: FormValidatorService,
     protected loadingBar: LoadingBarService,
@@ -43,7 +42,7 @@ export class VideoImportUrlComponent extends VideoSend implements OnInit, CanCom
     protected videoCaptionService: VideoCaptionService,
     private router: Router,
     private videoImportService: VideoImportService,
-    private i18n: I18n
+    private hooks: HooksService
   ) {
     super()
   }
@@ -52,22 +51,24 @@ export class VideoImportUrlComponent extends VideoSend implements OnInit, CanCom
     super.ngOnInit()
   }
 
+  ngAfterViewInit () {
+    this.hooks.runAction('action:video-url-import.init', 'video-edit')
+  }
+
   canDeactivate () {
     return { canDeactivate: true }
   }
 
   isTargetUrlValid () {
-    return this.targetUrl && this.targetUrl.match(/https?:\/\//)
+    return this.targetUrl?.match(/https?:\/\//)
   }
 
   importVideo () {
     this.isImportingVideo = true
 
     const videoUpdate: VideoUpdate = {
-      privacy: this.firstStepPrivacyId,
+      privacy: this.highestPrivacy,
       waitTranscoding: false,
-      commentsEnabled: true,
-      downloadEnabled: true,
       channelId: this.firstStepChannelId
     }
 
@@ -76,57 +77,39 @@ export class VideoImportUrlComponent extends VideoSend implements OnInit, CanCom
     this.videoImportService
         .importVideoUrl(this.targetUrl, videoUpdate)
         .pipe(
-          switchMap(res => {
-            return this.videoCaptionService
-                .listCaptions(res.video.id)
-                .pipe(
-                  map(result => ({ video: res.video, videoCaptions: result.data }))
-                )
+          switchMap(previous => {
+            return forkJoin([
+              this.videoCaptionService.listCaptions(previous.video.uuid),
+              this.videoService.getVideo({ videoId: previous.video.uuid })
+            ]).pipe(map(([ videoCaptionsResult, video ]) => ({ videoCaptions: videoCaptionsResult.data, video })))
           })
         )
-        .subscribe(
-          ({ video, videoCaptions }) => {
+        .subscribe({
+          next: ({ video, videoCaptions }) => {
             this.loadingBar.useRef().complete()
             this.firstStepDone.emit(video.name)
             this.isImportingVideo = false
             this.hasImportedVideo = true
 
-            const absoluteAPIUrl = getAbsoluteAPIUrl()
-
-            const thumbnailUrl = video.thumbnailPath
-              ? absoluteAPIUrl + video.thumbnailPath
-              : null
-
-            const previewUrl = video.previewPath
-              ? absoluteAPIUrl + video.previewPath
-              : null
-
-            this.video = new VideoEdit(Object.assign(video, {
-              commentsEnabled: videoUpdate.commentsEnabled,
-              downloadEnabled: videoUpdate.downloadEnabled,
-              support: null,
-              thumbnailUrl,
-              previewUrl
-            }))
+            this.video = new VideoEdit(video)
+            this.video.patch({ privacy: this.firstStepPrivacyId })
 
             this.videoCaptions = videoCaptions
 
-            this.hydrateFormFromVideo()
+            hydrateFormFromVideo(this.form, this.video, true)
           },
 
-          err => {
+          error: err => {
             this.loadingBar.useRef().complete()
             this.isImportingVideo = false
             this.firstStepError.emit()
             this.notifier.error(err.message)
           }
-        )
+        })
   }
 
-  updateSecondStep () {
-    if (this.checkForm() === false) {
-      return
-    }
+  async updateSecondStep () {
+    if (!await this.isFormValid()) return
 
     this.video.patch(this.form.value)
 
@@ -134,45 +117,19 @@ export class VideoImportUrlComponent extends VideoSend implements OnInit, CanCom
 
     // Update the video
     this.updateVideoAndCaptions(this.video)
-        .subscribe(
-          () => {
+        .subscribe({
+          next: () => {
             this.isUpdatingVideo = false
-            this.notifier.success(this.i18n('Video to import updated.'))
+            this.notifier.success($localize`Video to import updated.`)
 
-            this.router.navigate([ '/my-account', 'video-imports' ])
+            this.router.navigate([ '/my-library', 'video-imports' ])
           },
 
-          err => {
+          error: err => {
             this.error = err.message
             scrollToTop()
             console.error(err)
           }
-        )
-
-  }
-
-  private hydrateFormFromVideo () {
-    this.form.patchValue(this.video.toFormPatch())
-
-    const objects = [
-      {
-        url: 'thumbnailUrl',
-        name: 'thumbnailfile'
-      },
-      {
-        url: 'previewUrl',
-        name: 'previewfile'
-      }
-    ]
-
-    for (const obj of objects) {
-      fetch(this.video[obj.url])
-        .then(response => response.blob())
-        .then(data => {
-          this.form.patchValue({
-            [ obj.name ]: data
-          })
         })
-    }
   }
 }