diff options
-rw-r--r-- | server/controllers/api/video-playlist.ts | 3 | ||||
-rw-r--r-- | server/tests/fixtures/peertube-plugin-test/main.js | 4 | ||||
-rw-r--r-- | server/tests/plugins/action-hooks.ts | 40 | ||||
-rw-r--r-- | shared/models/plugins/server/server-hook.model.ts | 5 |
4 files changed, 49 insertions, 3 deletions
diff --git a/server/controllers/api/video-playlist.ts b/server/controllers/api/video-playlist.ts index c25aed20b..5c4aa50ac 100644 --- a/server/controllers/api/video-playlist.ts +++ b/server/controllers/api/video-playlist.ts | |||
@@ -43,6 +43,7 @@ import { | |||
43 | import { AccountModel } from '../../models/account/account' | 43 | import { AccountModel } from '../../models/account/account' |
44 | import { VideoPlaylistModel } from '../../models/video/video-playlist' | 44 | import { VideoPlaylistModel } from '../../models/video/video-playlist' |
45 | import { VideoPlaylistElementModel } from '../../models/video/video-playlist-element' | 45 | import { VideoPlaylistElementModel } from '../../models/video/video-playlist-element' |
46 | import { Hooks } from '@server/lib/plugins/hooks' | ||
46 | 47 | ||
47 | const reqThumbnailFile = createReqFiles([ 'thumbnailfile' ], MIMETYPES.IMAGE.MIMETYPE_EXT, { thumbnailfile: CONFIG.STORAGE.TMP_DIR }) | 48 | const reqThumbnailFile = createReqFiles([ 'thumbnailfile' ], MIMETYPES.IMAGE.MIMETYPE_EXT, { thumbnailfile: CONFIG.STORAGE.TMP_DIR }) |
48 | 49 | ||
@@ -330,6 +331,8 @@ async function addVideoInPlaylist (req: express.Request, res: express.Response) | |||
330 | 331 | ||
331 | logger.info('Video added in playlist %s at position %d.', videoPlaylist.uuid, playlistElement.position) | 332 | logger.info('Video added in playlist %s at position %d.', videoPlaylist.uuid, playlistElement.position) |
332 | 333 | ||
334 | Hooks.runAction('action:api.video-playlist-element.created', { playlistElement }) | ||
335 | |||
333 | return res.json({ | 336 | return res.json({ |
334 | videoPlaylistElement: { | 337 | videoPlaylistElement: { |
335 | id: playlistElement.id | 338 | id: playlistElement.id |
diff --git a/server/tests/fixtures/peertube-plugin-test/main.js b/server/tests/fixtures/peertube-plugin-test/main.js index 5e922ad1f..f8e6f0b98 100644 --- a/server/tests/fixtures/peertube-plugin-test/main.js +++ b/server/tests/fixtures/peertube-plugin-test/main.js | |||
@@ -19,7 +19,9 @@ async function register ({ registerHook, registerSetting, settingsManager, stora | |||
19 | 'action:api.user.created', | 19 | 'action:api.user.created', |
20 | 'action:api.user.deleted', | 20 | 'action:api.user.deleted', |
21 | 'action:api.user.updated', | 21 | 'action:api.user.updated', |
22 | 'action:api.user.oauth2-got-token' | 22 | 'action:api.user.oauth2-got-token', |
23 | |||
24 | 'action:api.video-playlist-element.created' | ||
23 | ] | 25 | ] |
24 | 26 | ||
25 | for (const h of actionHooks) { | 27 | for (const h of actionHooks) { |
diff --git a/server/tests/plugins/action-hooks.ts b/server/tests/plugins/action-hooks.ts index ac9f2cea5..0f57ef7fe 100644 --- a/server/tests/plugins/action-hooks.ts +++ b/server/tests/plugins/action-hooks.ts | |||
@@ -1,13 +1,15 @@ | |||
1 | /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ | 1 | /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ |
2 | 2 | ||
3 | import 'mocha' | 3 | import 'mocha' |
4 | import { ServerHookName, VideoPrivacy } from '@shared/models' | 4 | import { ServerHookName, VideoPlaylistPrivacy, VideoPrivacy } from '@shared/models' |
5 | import { | 5 | import { |
6 | addVideoCommentReply, | 6 | addVideoCommentReply, |
7 | addVideoCommentThread, | 7 | addVideoCommentThread, |
8 | addVideoInPlaylist, | ||
8 | blockUser, | 9 | blockUser, |
9 | createLive, | 10 | createLive, |
10 | createUser, | 11 | createUser, |
12 | createVideoPlaylist, | ||
11 | deleteVideoComment, | 13 | deleteVideoComment, |
12 | getPluginTestPath, | 14 | getPluginTestPath, |
13 | installPlugin, | 15 | installPlugin, |
@@ -69,6 +71,7 @@ describe('Test plugin action hooks', function () { | |||
69 | }) | 71 | }) |
70 | 72 | ||
71 | describe('Videos hooks', function () { | 73 | describe('Videos hooks', function () { |
74 | |||
72 | it('Should run action:api.video.uploaded', async function () { | 75 | it('Should run action:api.video.uploaded', async function () { |
73 | const res = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'video' }) | 76 | const res = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'video' }) |
74 | videoUUID = res.body.video.uuid | 77 | videoUUID = res.body.video.uuid |
@@ -177,6 +180,41 @@ describe('Test plugin action hooks', function () { | |||
177 | }) | 180 | }) |
178 | }) | 181 | }) |
179 | 182 | ||
183 | describe('Playlist hooks', function () { | ||
184 | let playlistId: number | ||
185 | let videoId: number | ||
186 | |||
187 | before(async function () { | ||
188 | { | ||
189 | const res = await createVideoPlaylist({ | ||
190 | url: servers[0].url, | ||
191 | token: servers[0].accessToken, | ||
192 | playlistAttrs: { | ||
193 | displayName: 'My playlist', | ||
194 | privacy: VideoPlaylistPrivacy.PRIVATE | ||
195 | } | ||
196 | }) | ||
197 | playlistId = res.body.videoPlaylist.id | ||
198 | } | ||
199 | |||
200 | { | ||
201 | const res = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'my super name' }) | ||
202 | videoId = res.body.video.id | ||
203 | } | ||
204 | }) | ||
205 | |||
206 | it('Should run action:api.video-playlist-element.created', async function () { | ||
207 | await addVideoInPlaylist({ | ||
208 | url: servers[0].url, | ||
209 | token: servers[0].accessToken, | ||
210 | playlistId, | ||
211 | elementAttrs: { videoId } | ||
212 | }) | ||
213 | |||
214 | await checkHook('action:api.video-playlist-element.created') | ||
215 | }) | ||
216 | }) | ||
217 | |||
180 | after(async function () { | 218 | after(async function () { |
181 | await cleanupTests(servers) | 219 | await cleanupTests(servers) |
182 | }) | 220 | }) |
diff --git a/shared/models/plugins/server/server-hook.model.ts b/shared/models/plugins/server/server-hook.model.ts index dae243dbf..5f29534b5 100644 --- a/shared/models/plugins/server/server-hook.model.ts +++ b/shared/models/plugins/server/server-hook.model.ts | |||
@@ -114,7 +114,10 @@ export const serverActionHookObject = { | |||
114 | 'action:api.user.updated': true, | 114 | 'action:api.user.updated': true, |
115 | 115 | ||
116 | // Fired when a user got a new oauth2 token | 116 | // Fired when a user got a new oauth2 token |
117 | 'action:api.user.oauth2-got-token': true | 117 | 'action:api.user.oauth2-got-token': true, |
118 | |||
119 | // Fired when a video is added to a playlist | ||
120 | 'action:api.video-playlist-element.created': true | ||
118 | } | 121 | } |
119 | 122 | ||
120 | export type ServerActionHookName = keyof typeof serverActionHookObject | 123 | export type ServerActionHookName = keyof typeof serverActionHookObject |