diff --git a/client/src/app/+my-library/my-video-playlists/my-video-playlist-elements.component.ts b/client/src/app/+my-library/my-video-playlists/my-video-playlist-elements.component.ts index d6959a50e..8fba423c3 100644 --- a/client/src/app/+my-library/my-video-playlists/my-video-playlist-elements.component.ts +++ b/client/src/app/+my-library/my-video-playlists/my-video-playlist-elements.component.ts @@ -155,7 +155,7 @@ export class MyVideoPlaylistElementsComponent implements OnInit, OnDestroy { } private loadElements () { - this.videoPlaylistService.getPlaylistVideos(this.videoPlaylistId, this.pagination) + this.videoPlaylistService.getPlaylistVideos({ videoPlaylistId: this.videoPlaylistId, componentPagination: this.pagination }) .subscribe(({ total, data }) => { this.playlistElements = this.playlistElements.concat(data) this.pagination.totalItems = total diff --git a/client/src/app/+videos/+video-watch/shared/playlist/video-watch-playlist.component.ts b/client/src/app/+videos/+video-watch/shared/playlist/video-watch-playlist.component.ts index 78b3af4a7..b2863fed6 100644 --- a/client/src/app/+videos/+video-watch/shared/playlist/video-watch-playlist.component.ts +++ b/client/src/app/+videos/+video-watch/shared/playlist/video-watch-playlist.component.ts @@ -1,6 +1,14 @@ import { Component, EventEmitter, Input, Output } from '@angular/core' import { Router } from '@angular/router' -import { AuthService, ComponentPagination, LocalStorageService, Notifier, SessionStorageService, UserService } from '@app/core' +import { + AuthService, + ComponentPagination, + HooksService, + LocalStorageService, + Notifier, + SessionStorageService, + UserService +} from '@app/core' import { VideoPlaylist, VideoPlaylistElement, VideoPlaylistService } from '@app/shared/shared-video-playlist' import { peertubeLocalStorage, peertubeSessionStorage } from '@root-helpers/peertube-web-storage' import { VideoPlaylistPrivacy } from '@shared/models' @@ -34,6 +42,7 @@ export class VideoWatchPlaylistComponent { currentPlaylistPosition: number constructor ( + private hooks: HooksService, private userService: UserService, private auth: AuthService, private notifier: Notifier, @@ -87,31 +96,38 @@ export class VideoWatchPlaylistComponent { } loadPlaylistElements (playlist: VideoPlaylist, redirectToFirst = false, position?: number) { - this.videoPlaylist.getPlaylistVideos(playlist.uuid, this.playlistPagination) - .subscribe(({ total, data }) => { - this.playlistElements = this.playlistElements.concat(data) - this.playlistPagination.totalItems = total + const obs = this.hooks.wrapObsFun( + this.videoPlaylist.getPlaylistVideos.bind(this.videoPlaylist), + { videoPlaylistId: playlist.uuid, componentPagination: this.playlistPagination }, + 'video-watch', + 'filter:api.video-watch.video-playlist-elements.get.params', + 'filter:api.video-watch.video-playlist-elements.get.result' + ) - const firstAvailableVideo = this.playlistElements.find(e => !!e.video) - if (!firstAvailableVideo) { - this.noPlaylistVideos = true - return - } + obs.subscribe(({ total, data: playlistElements }) => { + this.playlistElements = this.playlistElements.concat(playlistElements) + this.playlistPagination.totalItems = total - if (position) this.updatePlaylistIndex(position) + const firstAvailableVideo = this.playlistElements.find(e => !!e.video) + if (!firstAvailableVideo) { + this.noPlaylistVideos = true + return + } - if (redirectToFirst) { - const extras = { - queryParams: { - start: firstAvailableVideo.startTimestamp, - stop: firstAvailableVideo.stopTimestamp, - playlistPosition: firstAvailableVideo.position - }, - replaceUrl: true - } - this.router.navigate([], extras) - } - }) + if (position) this.updatePlaylistIndex(position) + + if (redirectToFirst) { + const extras = { + queryParams: { + start: firstAvailableVideo.startTimestamp, + stop: firstAvailableVideo.stopTimestamp, + playlistPosition: firstAvailableVideo.position + }, + replaceUrl: true + } + this.router.navigate([], extras) + } + }) } updatePlaylistIndex (position: number) { diff --git a/client/src/app/+videos/+video-watch/video-watch.component.ts b/client/src/app/+videos/+video-watch/video-watch.component.ts index acfd46a41..f0d159be3 100644 --- a/client/src/app/+videos/+video-watch/video-watch.component.ts +++ b/client/src/app/+videos/+video-watch/video-watch.component.ts @@ -455,7 +455,13 @@ export class VideoWatchComponent implements OnInit, OnDestroy { this.zone.run(() => this.theaterEnabled = enabled) }) - this.hooks.runAction('action:video-watch.player.loaded', 'video-watch', { player: this.player, videojs, video: this.video }) + this.hooks.runAction('action:video-watch.player.loaded', 'video-watch', { + player: this.player, + playlist: this.playlist, + playlistPosition: this.playlistPosition, + videojs, + video: this.video + }) }) } diff --git a/client/src/app/shared/shared-video-playlist/video-playlist.service.ts b/client/src/app/shared/shared-video-playlist/video-playlist.service.ts index 0a01af593..76835b9fc 100644 --- a/client/src/app/shared/shared-video-playlist/video-playlist.service.ts +++ b/client/src/app/shared/shared-video-playlist/video-playlist.service.ts @@ -256,12 +256,12 @@ export class VideoPlaylistService { ) } - getPlaylistVideos ( - videoPlaylistId: number | string, + getPlaylistVideos (options: { + videoPlaylistId: number | string componentPagination: ComponentPaginationLight - ): Observable> { - const path = VideoPlaylistService.BASE_VIDEO_PLAYLIST_URL + videoPlaylistId + '/videos' - const pagination = this.restService.componentPaginationToRestPagination(componentPagination) + }): Observable> { + const path = VideoPlaylistService.BASE_VIDEO_PLAYLIST_URL + options.videoPlaylistId + '/videos' + const pagination = this.restService.componentPaginationToRestPagination(options.componentPagination) let params = new HttpParams() params = this.restService.addRestGetParams(params, pagination) diff --git a/shared/models/plugins/client/client-hook.model.ts b/shared/models/plugins/client/client-hook.model.ts index d811e2c67..7dd8bc507 100644 --- a/shared/models/plugins/client/client-hook.model.ts +++ b/shared/models/plugins/client/client-hook.model.ts @@ -26,6 +26,10 @@ export const clientFilterHookObject = { 'filter:api.video-watch.video.get.params': true, 'filter:api.video-watch.video.get.result': true, + // Filter params/result of the function that fetch video playlist elements of the video-watch page + 'filter:api.video-watch.video-playlist-elements.get.params': true, + 'filter:api.video-watch.video-playlist-elements.get.result': true, + // Filter params/result of the function that fetch the threads of the video-watch page 'filter:api.video-watch.video-threads.list.params': true, 'filter:api.video-watch.video-threads.list.result': true,