1
0
Fork 0

add ...playlist.elements.loaded hook (#4387)

* client: add ...playlist.elements.loaded hook

closes #4385

* fix linting error

* client: add playlist metadata to video-watch hooks

* Prefer using a filter for playlist elements hook

Co-authored-by: Chocobozzz <me@florianbigard.com>
This commit is contained in:
kontrollanten 2021-10-12 13:45:55 +02:00 committed by GitHub
parent 8d8a037e3f
commit c3bb04413e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 56 additions and 30 deletions

View File

@ -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

View File

@ -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) {

View File

@ -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
})
})
}

View File

@ -256,12 +256,12 @@ export class VideoPlaylistService {
)
}
getPlaylistVideos (
videoPlaylistId: number | string,
getPlaylistVideos (options: {
videoPlaylistId: number | string
componentPagination: ComponentPaginationLight
): Observable<ResultList<VideoPlaylistElement>> {
const path = VideoPlaylistService.BASE_VIDEO_PLAYLIST_URL + videoPlaylistId + '/videos'
const pagination = this.restService.componentPaginationToRestPagination(componentPagination)
}): Observable<ResultList<VideoPlaylistElement>> {
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)

View File

@ -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,