Remove HLS torrents

pull/2427/head
Chocobozzz 2020-01-24 16:48:05 +01:00
parent b40eed8b09
commit ffc65cbd2a
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
6 changed files with 43 additions and 16 deletions

View File

@ -160,7 +160,7 @@ export class VideoRedundancyModel extends Model<VideoRedundancyModel> {
const videoUUID = videoStreamingPlaylist.Video.uuid const videoUUID = videoStreamingPlaylist.Video.uuid
logger.info('Removing duplicated video streaming playlist %s.', videoUUID) 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 })) .catch(err => logger.error('Cannot delete video streaming playlist files of %s.', videoUUID, { err }))
} }

View File

@ -17,10 +17,12 @@ import { join } from 'path'
import { sha1 } from '../../helpers/core-utils' import { sha1 } from '../../helpers/core-utils'
import { isArrayOf } from '../../helpers/custom-validators/misc' import { isArrayOf } from '../../helpers/custom-validators/misc'
import { Op, QueryTypes } from 'sequelize' 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 { 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 * as memoizee from 'memoizee'
import { remove } from 'fs-extra'
import { logger } from '@server/helpers/logger'
@Table({ @Table({
tableName: 'videoStreamingPlaylist', tableName: 'videoStreamingPlaylist',
@ -209,4 +211,10 @@ export class VideoStreamingPlaylistModel extends Model<VideoStreamingPlaylistMod
return this.type === other.type && return this.type === other.type &&
this.videoId === other.videoId this.videoId === other.videoId
} }
removeTorrent (this: MStreamingPlaylistVideo, videoFile: MVideoFile) {
const torrentPath = getTorrentFilePath(this, videoFile)
return remove(torrentPath)
.catch(err => logger.warn('Cannot delete torrent %s.', torrentPath, { err }))
}
} }

View File

@ -136,7 +136,8 @@ import {
MVideoThumbnailBlacklist, MVideoThumbnailBlacklist,
MVideoWithAllFiles, MVideoWithAllFiles,
MVideoWithFile, MVideoWithFile,
MVideoWithRights MVideoWithRights,
MStreamingPlaylistFiles
} from '../../typings/models' } from '../../typings/models'
import { MVideoFile, MVideoFileStreamingPlaylistVideo } from '../../typings/models/video/video-file' import { MVideoFile, MVideoFileStreamingPlaylistVideo } from '../../typings/models/video/video-file'
import { MThumbnail } from '../../typings/models/video/thumbnail' import { MThumbnail } from '../../typings/models/video/thumbnail'
@ -1071,7 +1072,13 @@ export class VideoModel extends Model<VideoModel> {
}) })
// Remove playlists file // 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 // Do not wait video deletion because we could be in a transaction
@ -2001,11 +2008,24 @@ export class VideoModel extends Model<VideoModel> {
.catch(err => logger.warn('Cannot delete torrent %s.', torrentPath, { err })) .catch(err => logger.warn('Cannot delete torrent %s.', torrentPath, { err }))
} }
removeStreamingPlaylist (isRedundancy = false) { async removeStreamingPlaylistFiles (streamingPlaylist: MStreamingPlaylist, isRedundancy = false) {
const directoryPath = getHLSDirectory(this, isRedundancy) const directoryPath = getHLSDirectory(this, isRedundancy)
return remove(directoryPath) await remove(directoryPath)
.catch(err => logger.warn('Cannot delete playlist directory %s.', directoryPath, { err }))
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 () { isOutdated () {

View File

@ -318,7 +318,7 @@ describe('Test videos redundancy', function () {
await check1WebSeed() await check1WebSeed()
await check0PlaylistRedundancies() 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 () { after(async function () {
@ -368,7 +368,7 @@ describe('Test videos redundancy', function () {
await check1WebSeed() await check1WebSeed()
await check0PlaylistRedundancies() await check0PlaylistRedundancies()
await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ 'videos' ]) await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].internalServerNumber, [ 'videos' ])
}) })
after(async function () { after(async function () {
@ -437,7 +437,7 @@ describe('Test videos redundancy', function () {
await waitJobs(servers) await waitJobs(servers)
for (const server of 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 waitJobs(servers)
await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ join('redundancy', 'hls') ]) await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].internalServerNumber, [ join('redundancy', 'hls') ])
}) })
after(async function () { after(async function () {

View File

@ -15,7 +15,6 @@ import {
createUser, createUser,
dateIsValid, dateIsValid,
doubleFollow, doubleFollow,
flushAndRunServer,
flushAndRunMultipleServers, flushAndRunMultipleServers,
getLocalVideos, getLocalVideos,
getVideo, 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 () { it('Should not have files of videos 3 and 3-2 on each server', async function () {
for (const server of servers) { for (const server of servers) {
await checkVideoFilesWereRemoved(toRemove[0].uuid, server.serverNumber) await checkVideoFilesWereRemoved(toRemove[0].uuid, server.internalServerNumber)
await checkVideoFilesWereRemoved(toRemove[1].uuid, server.serverNumber) await checkVideoFilesWereRemoved(toRemove[1].uuid, server.internalServerNumber)
} }
}) })

View File

@ -465,7 +465,7 @@ function rateVideo (url: string, accessToken: string, id: number, rating: string
function parseTorrentVideo (server: ServerInfo, videoUUID: string, resolution: number) { function parseTorrentVideo (server: ServerInfo, videoUUID: string, resolution: number) {
return new Promise<any>((res, rej) => { return new Promise<any>((res, rej) => {
const torrentName = videoUUID + '-' + resolution + '.torrent' 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) => { readFile(torrentPath, (err, data) => {
if (err) return rej(err) if (err) return rej(err)