X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Fschedulers%2Fvideos-redundancy-scheduler.ts;h=59b55ccccdfee16a68cb253b70c8b0a4f0d21928;hb=5ec3cbdf22fc88ebe57f370fc0bc0e3df7453458;hp=6e61cbe7d79bc283c24db626492c16255c816291;hpb=b764380ac23f4e9d4677d08acdc3474c2931a16d;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/schedulers/videos-redundancy-scheduler.ts b/server/lib/schedulers/videos-redundancy-scheduler.ts index 6e61cbe7d..59b55cccc 100644 --- a/server/lib/schedulers/videos-redundancy-scheduler.ts +++ b/server/lib/schedulers/videos-redundancy-scheduler.ts @@ -1,20 +1,11 @@ -import { AbstractScheduler } from './abstract-scheduler' -import { HLS_REDUNDANCY_DIRECTORY, REDUNDANCY, VIDEO_IMPORT_TIMEOUT, WEBSERVER } from '../../initializers/constants' -import { logger } from '../../helpers/logger' -import { VideosRedundancyStrategy } from '../../../shared/models/redundancy' -import { VideoRedundancyModel } from '../../models/redundancy/video-redundancy' -import { downloadWebTorrentVideo, generateMagnetUri } from '../../helpers/webtorrent' -import { join } from 'path' import { move } from 'fs-extra' -import { getServerActor } from '../../helpers/utils' -import { sendCreateCacheFile, sendUpdateCacheFile } from '../activitypub/send' -import { getVideoCacheFileActivityPubUrl, getVideoCacheStreamingPlaylistActivityPubUrl } from '../activitypub/url' -import { removeVideoRedundancy } from '../redundancy' -import { getOrCreateVideoAndAccountAndChannel } from '../activitypub' -import { downloadPlaylistSegments } from '../hls' -import { CONFIG } from '../../initializers/config' +import { join } from 'path' +import { getServerActor } from '@server/models/application/application' +import { TrackerModel } from '@server/models/server/tracker' +import { VideoModel } from '@server/models/video/video' import { - MStreamingPlaylist, MStreamingPlaylistFiles, + MStreamingPlaylist, + MStreamingPlaylistFiles, MStreamingPlaylistVideo, MVideoAccountLight, MVideoFile, @@ -23,14 +14,25 @@ import { MVideoRedundancyStreamingPlaylistVideo, MVideoRedundancyVideo, MVideoWithAllFiles -} from '@server/typings/models' -import { getVideoFilename } from '../video-paths' -import { VideoModel } from '@server/models/video/video' +} from '@server/types/models' +import { VideosRedundancyStrategy } from '../../../shared/models/redundancy' +import { logger } from '../../helpers/logger' +import { downloadWebTorrentVideo, generateMagnetUri } from '../../helpers/webtorrent' +import { CONFIG } from '../../initializers/config' +import { HLS_REDUNDANCY_DIRECTORY, REDUNDANCY, VIDEO_IMPORT_TIMEOUT } from '../../initializers/constants' +import { VideoRedundancyModel } from '../../models/redundancy/video-redundancy' +import { sendCreateCacheFile, sendUpdateCacheFile } from '../activitypub/send' +import { getLocalVideoCacheFileActivityPubUrl, getLocalVideoCacheStreamingPlaylistActivityPubUrl } from '../activitypub/url' +import { getOrCreateVideoAndAccountAndChannel } from '../activitypub/videos' +import { downloadPlaylistSegments } from '../hls' +import { removeVideoRedundancy } from '../redundancy' +import { generateHLSRedundancyUrl, generateWebTorrentRedundancyUrl } from '../video-paths' +import { AbstractScheduler } from './abstract-scheduler' type CandidateToDuplicate = { - redundancy: VideosRedundancyStrategy, - video: MVideoWithAllFiles, - files: MVideoFile[], + redundancy: VideosRedundancyStrategy + video: MVideoWithAllFiles + files: MVideoFile[] streamingPlaylists: MStreamingPlaylistFiles[] } @@ -220,18 +222,18 @@ export class VideosRedundancyScheduler extends AbstractScheduler { logger.info('Duplicating %s - %d in videos redundancy with "%s" strategy.', video.url, file.resolution, strategy) - const { baseUrlHttp, baseUrlWs } = video.getBaseUrls() - const magnetUri = generateMagnetUri(video, file, baseUrlHttp, baseUrlWs) + const trackerUrls = await TrackerModel.listUrlsByVideoId(video.id) + const magnetUri = generateMagnetUri(video, file, trackerUrls) const tmpPath = await downloadWebTorrentVideo({ magnetUri }, VIDEO_IMPORT_TIMEOUT) - const destPath = join(CONFIG.STORAGE.REDUNDANCY_DIR, getVideoFilename(video, file)) + const destPath = join(CONFIG.STORAGE.REDUNDANCY_DIR, file.filename) await move(tmpPath, destPath, { overwrite: true }) const createdModel: MVideoRedundancyFileVideo = await VideoRedundancyModel.create({ expiresOn, - url: getVideoCacheFileActivityPubUrl(file), - fileUrl: video.getVideoRedundancyUrl(file, WEBSERVER.URL), + url: getLocalVideoCacheFileActivityPubUrl(file), + fileUrl: generateWebTorrentRedundancyUrl(file), strategy, videoFileId: file.id, actorId: serverActor.id @@ -269,8 +271,8 @@ export class VideosRedundancyScheduler extends AbstractScheduler { const createdModel: MVideoRedundancyStreamingPlaylistVideo = await VideoRedundancyModel.create({ expiresOn, - url: getVideoCacheStreamingPlaylistActivityPubUrl(video, playlist), - fileUrl: playlist.getVideoRedundancyUrl(WEBSERVER.URL), + url: getLocalVideoCacheStreamingPlaylistActivityPubUrl(video, playlist), + fileUrl: generateHLSRedundancyUrl(video, playlistArg), strategy, videoStreamingPlaylistId: playlist.id, actorId: serverActor.id @@ -300,15 +302,23 @@ export class VideosRedundancyScheduler extends AbstractScheduler { const toDelete = await VideoRedundancyModel.loadOldestLocalExpired(redundancy.strategy, redundancy.minLifetime) if (!toDelete) return - await removeVideoRedundancy(toDelete) + const videoId = toDelete.VideoFile + ? toDelete.VideoFile.videoId + : toDelete.VideoStreamingPlaylist.videoId + + const redundancies = await VideoRedundancyModel.listLocalByVideoId(videoId) + + for (const redundancy of redundancies) { + await removeVideoRedundancy(redundancy) + } } } private async isTooHeavy (candidateToDuplicate: CandidateToDuplicate) { const maxSize = candidateToDuplicate.redundancy.size - const totalDuplicated = await VideoRedundancyModel.getTotalDuplicated(candidateToDuplicate.redundancy.strategy) - const totalWillDuplicate = totalDuplicated + this.getTotalFileSizes(candidateToDuplicate.files, candidateToDuplicate.streamingPlaylists) + const { totalUsed } = await VideoRedundancyModel.getStats(candidateToDuplicate.redundancy.strategy) + const totalWillDuplicate = totalUsed + this.getTotalFileSizes(candidateToDuplicate.files, candidateToDuplicate.streamingPlaylists) return totalWillDuplicate > maxSize }