X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=client%2Fsrc%2Fapp%2F%2Bvideos%2F%2Bvideo-edit%2Fvideo-add-components%2Fvideo-import-url.component.ts;h=971a2a070edac6f3386aa91e79ffc16ad0a037bd;hb=0146f3516ec458d7eaba3ede2addb23005bd4a28;hp=da25663d75eaae43d954ae20685ac5f22ac341e3;hpb=a02b93ce756d646a59cef57b5e4ff53c2bb30bec;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/app/+videos/+video-edit/video-add-components/video-import-url.component.ts b/client/src/app/+videos/+video-edit/video-add-components/video-import-url.component.ts index da25663d7..971a2a070 100644 --- a/client/src/app/+videos/+video-edit/video-add-components/video-import-url.component.ts +++ b/client/src/app/+videos/+video-edit/video-add-components/video-import-url.component.ts @@ -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() @Output() firstStepError = new EventEmitter() @@ -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 - }) }) - } } }