mirror of https://github.com/Chocobozzz/PeerTube
Remove HLS torrents
parent
b40eed8b09
commit
ffc65cbd2a
|
@ -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 }))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 }))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 () {
|
||||||
|
|
|
@ -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 () {
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue