diff --git a/server/models/redundancy/video-redundancy.ts b/server/models/redundancy/video-redundancy.ts index 77f83d8aa..8c9a7eabf 100644 --- a/server/models/redundancy/video-redundancy.ts +++ b/server/models/redundancy/video-redundancy.ts @@ -160,7 +160,7 @@ export class VideoRedundancyModel extends Model { const videoUUID = videoStreamingPlaylist.Video.uuid logger.info('Removing duplicated video streaming playlist %s.', videoUUID) - videoStreamingPlaylist.Video.removeStreamingPlaylist(true) + videoStreamingPlaylist.Video.removeStreamingPlaylistFiles(videoStreamingPlaylist, true) .catch(err => logger.error('Cannot delete video streaming playlist files of %s.', videoUUID, { err })) } diff --git a/server/models/video/video-streaming-playlist.ts b/server/models/video/video-streaming-playlist.ts index 0099add4e..249596218 100644 --- a/server/models/video/video-streaming-playlist.ts +++ b/server/models/video/video-streaming-playlist.ts @@ -17,10 +17,12 @@ import { join } from 'path' import { sha1 } from '../../helpers/core-utils' import { isArrayOf } from '../../helpers/custom-validators/misc' import { Op, QueryTypes } from 'sequelize' -import { MStreamingPlaylist, MVideoFile } from '@server/typings/models' +import { MStreamingPlaylist, MStreamingPlaylistVideo, MVideoFile } from '@server/typings/models' import { VideoFileModel } from '@server/models/video/video-file' -import { getTorrentFileName, getVideoFilename } from '@server/lib/video-paths' +import { getTorrentFileName, getTorrentFilePath, getVideoFilename } from '@server/lib/video-paths' import * as memoizee from 'memoizee' +import { remove } from 'fs-extra' +import { logger } from '@server/helpers/logger' @Table({ tableName: 'videoStreamingPlaylist', @@ -209,4 +211,10 @@ export class VideoStreamingPlaylistModel extends Model logger.warn('Cannot delete torrent %s.', torrentPath, { err })) + } } diff --git a/server/models/video/video.ts b/server/models/video/video.ts index 243871028..eacffe186 100644 --- a/server/models/video/video.ts +++ b/server/models/video/video.ts @@ -136,7 +136,8 @@ import { MVideoThumbnailBlacklist, MVideoWithAllFiles, MVideoWithFile, - MVideoWithRights + MVideoWithRights, + MStreamingPlaylistFiles } from '../../typings/models' import { MVideoFile, MVideoFileStreamingPlaylistVideo } from '../../typings/models/video/video-file' import { MThumbnail } from '../../typings/models/video/thumbnail' @@ -1071,7 +1072,13 @@ export class VideoModel extends Model { }) // Remove playlists file - tasks.push(instance.removeStreamingPlaylist()) + if (!Array.isArray(instance.VideoStreamingPlaylists)) { + instance.VideoStreamingPlaylists = await instance.$get('VideoStreamingPlaylists') + } + + for (const p of instance.VideoStreamingPlaylists) { + tasks.push(instance.removeStreamingPlaylistFiles(p)) + } } // Do not wait video deletion because we could be in a transaction @@ -2001,11 +2008,24 @@ export class VideoModel extends Model { .catch(err => logger.warn('Cannot delete torrent %s.', torrentPath, { err })) } - removeStreamingPlaylist (isRedundancy = false) { + async removeStreamingPlaylistFiles (streamingPlaylist: MStreamingPlaylist, isRedundancy = false) { const directoryPath = getHLSDirectory(this, isRedundancy) - return remove(directoryPath) - .catch(err => logger.warn('Cannot delete playlist directory %s.', directoryPath, { err })) + await remove(directoryPath) + + if (isRedundancy !== true) { + let streamingPlaylistWithFiles = streamingPlaylist as MStreamingPlaylistFilesVideo + streamingPlaylistWithFiles.Video = this + + if (!Array.isArray(streamingPlaylistWithFiles.VideoFiles)) { + streamingPlaylistWithFiles.VideoFiles = await streamingPlaylistWithFiles.$get('VideoFiles') + } + + // Remove physical files and torrents + await Promise.all( + streamingPlaylistWithFiles.VideoFiles.map(file => streamingPlaylistWithFiles.removeTorrent(file)) + ) + } } isOutdated () { diff --git a/server/tests/api/redundancy/redundancy.ts b/server/tests/api/redundancy/redundancy.ts index be24eb32f..1cdf93aa1 100644 --- a/server/tests/api/redundancy/redundancy.ts +++ b/server/tests/api/redundancy/redundancy.ts @@ -318,7 +318,7 @@ describe('Test videos redundancy', function () { await check1WebSeed() await check0PlaylistRedundancies() - await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ 'videos', join('playlists', 'hls') ]) + await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].internalServerNumber, [ 'videos', join('playlists', 'hls') ]) }) after(async function () { @@ -368,7 +368,7 @@ describe('Test videos redundancy', function () { await check1WebSeed() await check0PlaylistRedundancies() - await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ 'videos' ]) + await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].internalServerNumber, [ 'videos' ]) }) after(async function () { @@ -437,7 +437,7 @@ describe('Test videos redundancy', function () { await waitJobs(servers) for (const server of servers) { - await checkVideoFilesWereRemoved(video1Server2UUID, server.serverNumber) + await checkVideoFilesWereRemoved(video1Server2UUID, server.internalServerNumber) } }) @@ -572,7 +572,7 @@ describe('Test videos redundancy', function () { await waitJobs(servers) - await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ join('redundancy', 'hls') ]) + await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].internalServerNumber, [ join('redundancy', 'hls') ]) }) after(async function () { diff --git a/server/tests/api/videos/multiple-servers.ts b/server/tests/api/videos/multiple-servers.ts index 22d87b88c..fa3e250ec 100644 --- a/server/tests/api/videos/multiple-servers.ts +++ b/server/tests/api/videos/multiple-servers.ts @@ -15,7 +15,6 @@ import { createUser, dateIsValid, doubleFollow, - flushAndRunServer, flushAndRunMultipleServers, getLocalVideos, getVideo, @@ -697,8 +696,8 @@ describe('Test multiple servers', function () { it('Should not have files of videos 3 and 3-2 on each server', async function () { for (const server of servers) { - await checkVideoFilesWereRemoved(toRemove[0].uuid, server.serverNumber) - await checkVideoFilesWereRemoved(toRemove[1].uuid, server.serverNumber) + await checkVideoFilesWereRemoved(toRemove[0].uuid, server.internalServerNumber) + await checkVideoFilesWereRemoved(toRemove[1].uuid, server.internalServerNumber) } }) diff --git a/shared/extra-utils/videos/videos.ts b/shared/extra-utils/videos/videos.ts index d1ac48292..7a77a03ad 100644 --- a/shared/extra-utils/videos/videos.ts +++ b/shared/extra-utils/videos/videos.ts @@ -465,7 +465,7 @@ function rateVideo (url: string, accessToken: string, id: number, rating: string function parseTorrentVideo (server: ServerInfo, videoUUID: string, resolution: number) { return new Promise((res, rej) => { const torrentName = videoUUID + '-' + resolution + '.torrent' - const torrentPath = join(root(), 'test' + server.serverNumber, 'torrents', torrentName) + const torrentPath = join(root(), 'test' + server.internalServerNumber, 'torrents', torrentName) readFile(torrentPath, (err, data) => { if (err) return rej(err)