2020-01-31 09:56:52 -06:00
|
|
|
/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
|
2019-08-01 09:54:24 -05:00
|
|
|
|
2022-08-17 08:44:32 -05:00
|
|
|
import { expect } from 'chai'
|
2023-06-06 04:14:13 -05:00
|
|
|
import { testImageGeneratedByFFmpeg } from '@server/tests/shared'
|
2021-12-17 04:58:15 -06:00
|
|
|
import { VideoPlaylistPrivacy } from '@shared/models'
|
2019-08-01 09:54:24 -05:00
|
|
|
import {
|
|
|
|
cleanupTests,
|
2021-07-16 02:47:51 -05:00
|
|
|
createMultipleServers,
|
2021-07-16 07:27:30 -05:00
|
|
|
doubleFollow,
|
2021-07-16 02:47:51 -05:00
|
|
|
PeerTubeServer,
|
2019-08-01 09:54:24 -05:00
|
|
|
setAccessTokensToServers,
|
|
|
|
setDefaultVideoChannel,
|
2020-01-31 09:56:52 -06:00
|
|
|
waitJobs
|
2021-12-17 04:58:15 -06:00
|
|
|
} from '@shared/server-commands'
|
2019-08-01 09:54:24 -05:00
|
|
|
|
|
|
|
describe('Playlist thumbnail', function () {
|
2021-07-16 02:47:51 -05:00
|
|
|
let servers: PeerTubeServer[] = []
|
2019-08-01 09:54:24 -05:00
|
|
|
|
2021-07-08 08:54:39 -05:00
|
|
|
let playlistWithoutThumbnailId: number
|
|
|
|
let playlistWithThumbnailId: number
|
2019-08-01 09:54:24 -05:00
|
|
|
|
|
|
|
let withThumbnailE1: number
|
|
|
|
let withThumbnailE2: number
|
|
|
|
let withoutThumbnailE1: number
|
|
|
|
let withoutThumbnailE2: number
|
|
|
|
|
|
|
|
let video1: number
|
|
|
|
let video2: number
|
|
|
|
|
2021-07-16 02:47:51 -05:00
|
|
|
async function getPlaylistWithoutThumbnail (server: PeerTubeServer) {
|
2021-07-16 02:04:35 -05:00
|
|
|
const body = await server.playlists.list({ start: 0, count: 10 })
|
2019-08-01 09:54:24 -05:00
|
|
|
|
2021-07-08 08:54:39 -05:00
|
|
|
return body.data.find(p => p.displayName === 'playlist without thumbnail')
|
2019-08-01 09:54:24 -05:00
|
|
|
}
|
|
|
|
|
2021-07-16 02:47:51 -05:00
|
|
|
async function getPlaylistWithThumbnail (server: PeerTubeServer) {
|
2021-07-16 02:04:35 -05:00
|
|
|
const body = await server.playlists.list({ start: 0, count: 10 })
|
2019-08-01 09:54:24 -05:00
|
|
|
|
2021-07-08 08:54:39 -05:00
|
|
|
return body.data.find(p => p.displayName === 'playlist with thumbnail')
|
2019-08-01 09:54:24 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
before(async function () {
|
|
|
|
this.timeout(120000)
|
|
|
|
|
2022-02-11 03:51:33 -06:00
|
|
|
servers = await createMultipleServers(2)
|
2019-08-01 09:54:24 -05:00
|
|
|
|
|
|
|
// Get the access tokens
|
|
|
|
await setAccessTokensToServers(servers)
|
|
|
|
await setDefaultVideoChannel(servers)
|
|
|
|
|
2022-02-11 03:51:33 -06:00
|
|
|
for (const server of servers) {
|
|
|
|
await server.config.disableTranscoding()
|
|
|
|
}
|
|
|
|
|
2019-08-01 09:54:24 -05:00
|
|
|
// Server 1 and server 2 follow each other
|
|
|
|
await doubleFollow(servers[0], servers[1])
|
|
|
|
|
2021-07-16 02:04:35 -05:00
|
|
|
video1 = (await servers[0].videos.quickUpload({ name: 'video 1' })).id
|
|
|
|
video2 = (await servers[0].videos.quickUpload({ name: 'video 2' })).id
|
2019-08-01 09:54:24 -05:00
|
|
|
|
|
|
|
await waitJobs(servers)
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Should automatically update the thumbnail when adding an element', async function () {
|
|
|
|
this.timeout(30000)
|
|
|
|
|
2021-07-16 02:04:35 -05:00
|
|
|
const created = await servers[1].playlists.create({
|
2021-07-08 08:54:39 -05:00
|
|
|
attributes: {
|
2019-08-01 09:54:24 -05:00
|
|
|
displayName: 'playlist without thumbnail',
|
|
|
|
privacy: VideoPlaylistPrivacy.PUBLIC,
|
2021-07-16 02:04:35 -05:00
|
|
|
videoChannelId: servers[1].store.channel.id
|
2019-08-01 09:54:24 -05:00
|
|
|
}
|
|
|
|
})
|
2021-07-08 08:54:39 -05:00
|
|
|
playlistWithoutThumbnailId = created.id
|
2019-08-01 09:54:24 -05:00
|
|
|
|
2021-07-16 02:04:35 -05:00
|
|
|
const added = await servers[1].playlists.addElement({
|
2021-07-08 08:54:39 -05:00
|
|
|
playlistId: playlistWithoutThumbnailId,
|
|
|
|
attributes: { videoId: video1 }
|
2019-08-01 09:54:24 -05:00
|
|
|
})
|
2021-07-08 08:54:39 -05:00
|
|
|
withoutThumbnailE1 = added.id
|
2019-08-01 09:54:24 -05:00
|
|
|
|
|
|
|
await waitJobs(servers)
|
|
|
|
|
|
|
|
for (const server of servers) {
|
|
|
|
const p = await getPlaylistWithoutThumbnail(server)
|
2023-06-06 04:14:13 -05:00
|
|
|
await testImageGeneratedByFFmpeg(server.url, 'thumbnail-playlist', p.thumbnailPath)
|
2019-08-01 09:54:24 -05:00
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Should not update the thumbnail if we explicitly uploaded a thumbnail', async function () {
|
|
|
|
this.timeout(30000)
|
|
|
|
|
2021-07-16 02:04:35 -05:00
|
|
|
const created = await servers[1].playlists.create({
|
2021-07-08 08:54:39 -05:00
|
|
|
attributes: {
|
2019-08-01 09:54:24 -05:00
|
|
|
displayName: 'playlist with thumbnail',
|
|
|
|
privacy: VideoPlaylistPrivacy.PUBLIC,
|
2021-07-16 02:04:35 -05:00
|
|
|
videoChannelId: servers[1].store.channel.id,
|
2023-06-06 04:14:13 -05:00
|
|
|
thumbnailfile: 'custom-thumbnail.jpg'
|
2019-08-01 09:54:24 -05:00
|
|
|
}
|
|
|
|
})
|
2021-07-08 08:54:39 -05:00
|
|
|
playlistWithThumbnailId = created.id
|
2019-08-01 09:54:24 -05:00
|
|
|
|
2021-07-16 02:04:35 -05:00
|
|
|
const added = await servers[1].playlists.addElement({
|
2021-07-08 08:54:39 -05:00
|
|
|
playlistId: playlistWithThumbnailId,
|
|
|
|
attributes: { videoId: video1 }
|
2019-08-01 09:54:24 -05:00
|
|
|
})
|
2021-07-08 08:54:39 -05:00
|
|
|
withThumbnailE1 = added.id
|
2019-08-01 09:54:24 -05:00
|
|
|
|
|
|
|
await waitJobs(servers)
|
|
|
|
|
|
|
|
for (const server of servers) {
|
|
|
|
const p = await getPlaylistWithThumbnail(server)
|
2023-06-06 04:14:13 -05:00
|
|
|
await testImageGeneratedByFFmpeg(server.url, 'custom-thumbnail', p.thumbnailPath)
|
2019-08-01 09:54:24 -05:00
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Should automatically update the thumbnail when moving the first element', async function () {
|
|
|
|
this.timeout(30000)
|
|
|
|
|
2021-07-16 02:04:35 -05:00
|
|
|
const added = await servers[1].playlists.addElement({
|
2021-07-08 08:54:39 -05:00
|
|
|
playlistId: playlistWithoutThumbnailId,
|
|
|
|
attributes: { videoId: video2 }
|
2019-08-01 09:54:24 -05:00
|
|
|
})
|
2021-07-08 08:54:39 -05:00
|
|
|
withoutThumbnailE2 = added.id
|
2019-08-01 09:54:24 -05:00
|
|
|
|
2021-07-16 02:04:35 -05:00
|
|
|
await servers[1].playlists.reorderElements({
|
2021-07-08 08:54:39 -05:00
|
|
|
playlistId: playlistWithoutThumbnailId,
|
|
|
|
attributes: {
|
2019-08-01 09:54:24 -05:00
|
|
|
startPosition: 1,
|
|
|
|
insertAfterPosition: 2
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
await waitJobs(servers)
|
|
|
|
|
|
|
|
for (const server of servers) {
|
|
|
|
const p = await getPlaylistWithoutThumbnail(server)
|
2023-06-06 04:14:13 -05:00
|
|
|
await testImageGeneratedByFFmpeg(server.url, 'thumbnail-playlist', p.thumbnailPath)
|
2019-08-01 09:54:24 -05:00
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Should not update the thumbnail when moving the first element if we explicitly uploaded a thumbnail', async function () {
|
|
|
|
this.timeout(30000)
|
|
|
|
|
2021-07-16 02:04:35 -05:00
|
|
|
const added = await servers[1].playlists.addElement({
|
2021-07-08 08:54:39 -05:00
|
|
|
playlistId: playlistWithThumbnailId,
|
|
|
|
attributes: { videoId: video2 }
|
2019-08-01 09:54:24 -05:00
|
|
|
})
|
2021-07-08 08:54:39 -05:00
|
|
|
withThumbnailE2 = added.id
|
2019-08-01 09:54:24 -05:00
|
|
|
|
2021-07-16 02:04:35 -05:00
|
|
|
await servers[1].playlists.reorderElements({
|
2021-07-08 08:54:39 -05:00
|
|
|
playlistId: playlistWithThumbnailId,
|
|
|
|
attributes: {
|
2019-08-01 09:54:24 -05:00
|
|
|
startPosition: 1,
|
|
|
|
insertAfterPosition: 2
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
await waitJobs(servers)
|
|
|
|
|
|
|
|
for (const server of servers) {
|
|
|
|
const p = await getPlaylistWithThumbnail(server)
|
2023-06-06 04:14:13 -05:00
|
|
|
await testImageGeneratedByFFmpeg(server.url, 'custom-thumbnail', p.thumbnailPath)
|
2019-08-01 09:54:24 -05:00
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Should automatically update the thumbnail when deleting the first element', async function () {
|
|
|
|
this.timeout(30000)
|
|
|
|
|
2021-07-16 02:04:35 -05:00
|
|
|
await servers[1].playlists.removeElement({
|
2021-07-08 08:54:39 -05:00
|
|
|
playlistId: playlistWithoutThumbnailId,
|
|
|
|
elementId: withoutThumbnailE1
|
2019-08-01 09:54:24 -05:00
|
|
|
})
|
|
|
|
|
|
|
|
await waitJobs(servers)
|
|
|
|
|
|
|
|
for (const server of servers) {
|
|
|
|
const p = await getPlaylistWithoutThumbnail(server)
|
2023-06-06 04:14:13 -05:00
|
|
|
await testImageGeneratedByFFmpeg(server.url, 'thumbnail-playlist', p.thumbnailPath)
|
2019-08-01 09:54:24 -05:00
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Should not update the thumbnail when deleting the first element if we explicitly uploaded a thumbnail', async function () {
|
|
|
|
this.timeout(30000)
|
|
|
|
|
2021-07-16 02:04:35 -05:00
|
|
|
await servers[1].playlists.removeElement({
|
2021-07-08 08:54:39 -05:00
|
|
|
playlistId: playlistWithThumbnailId,
|
|
|
|
elementId: withThumbnailE1
|
2019-08-01 09:54:24 -05:00
|
|
|
})
|
|
|
|
|
|
|
|
await waitJobs(servers)
|
|
|
|
|
|
|
|
for (const server of servers) {
|
|
|
|
const p = await getPlaylistWithThumbnail(server)
|
2023-06-06 04:14:13 -05:00
|
|
|
await testImageGeneratedByFFmpeg(server.url, 'custom-thumbnail', p.thumbnailPath)
|
2019-08-01 09:54:24 -05:00
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Should the thumbnail when we delete the last element', async function () {
|
|
|
|
this.timeout(30000)
|
|
|
|
|
2021-07-16 02:04:35 -05:00
|
|
|
await servers[1].playlists.removeElement({
|
2021-07-08 08:54:39 -05:00
|
|
|
playlistId: playlistWithoutThumbnailId,
|
|
|
|
elementId: withoutThumbnailE2
|
2019-08-01 09:54:24 -05:00
|
|
|
})
|
|
|
|
|
|
|
|
await waitJobs(servers)
|
|
|
|
|
|
|
|
for (const server of servers) {
|
|
|
|
const p = await getPlaylistWithoutThumbnail(server)
|
|
|
|
expect(p.thumbnailPath).to.be.null
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
it('Should not update the thumbnail when we delete the last element if we explicitly uploaded a thumbnail', async function () {
|
|
|
|
this.timeout(30000)
|
|
|
|
|
2021-07-16 02:04:35 -05:00
|
|
|
await servers[1].playlists.removeElement({
|
2021-07-08 08:54:39 -05:00
|
|
|
playlistId: playlistWithThumbnailId,
|
|
|
|
elementId: withThumbnailE2
|
2019-08-01 09:54:24 -05:00
|
|
|
})
|
|
|
|
|
|
|
|
await waitJobs(servers)
|
|
|
|
|
|
|
|
for (const server of servers) {
|
|
|
|
const p = await getPlaylistWithThumbnail(server)
|
2023-06-06 04:14:13 -05:00
|
|
|
await testImageGeneratedByFFmpeg(server.url, 'custom-thumbnail', p.thumbnailPath)
|
2019-08-01 09:54:24 -05:00
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
after(async function () {
|
|
|
|
await cleanupTests(servers)
|
|
|
|
})
|
|
|
|
})
|