X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=server%2Flib%2Fhls.ts;h=05136c21cdd2bc85fc83c9348da492e1cff87b91;hb=453e83ea5d81d203ba34bc43cd5c2c750ba40568;hp=3575981f4b05e39567271c86c04042fa4eb4ce2e;hpb=28f3d1b36a70426795240c9370e47b6c4ba847f8;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/hls.ts b/server/lib/hls.ts index 3575981f4..05136c21c 100644 --- a/server/lib/hls.ts +++ b/server/lib/hls.ts @@ -1,6 +1,5 @@ -import { VideoModel } from '../models/video/video' -import { basename, join, dirname } from 'path' -import { CONFIG, HLS_PLAYLIST_DIRECTORY } from '../initializers' +import { basename, dirname, join } from 'path' +import { HLS_STREAMING_PLAYLIST_DIRECTORY, P2P_MEDIA_LOADER_PEER_VERSION } from '../initializers/constants' import { close, ensureDir, move, open, outputJSON, pathExists, read, readFile, remove, writeFile } from 'fs-extra' import { getVideoFileSize } from '../helpers/ffmpeg-utils' import { sha256 } from '../helpers/core-utils' @@ -9,9 +8,28 @@ import { logger } from '../helpers/logger' import { doRequest, doRequestAndSaveToFile } from '../helpers/requests' import { generateRandomString } from '../helpers/utils' import { flatten, uniq } from 'lodash' +import { VideoFileModel } from '../models/video/video-file' +import { CONFIG } from '../initializers/config' +import { sequelizeTypescript } from '../initializers/database' +import { MVideoWithFile } from '@server/typings/models' + +async function updateStreamingPlaylistsInfohashesIfNeeded () { + const playlistsToUpdate = await VideoStreamingPlaylistModel.listByIncorrectPeerVersion() + + // Use separate SQL queries, because we could have many videos to update + for (const playlist of playlistsToUpdate) { + await sequelizeTypescript.transaction(async t => { + const videoFiles = await VideoFileModel.listByStreamingPlaylist(playlist.id, t) + + playlist.p2pMediaLoaderInfohashes = VideoStreamingPlaylistModel.buildP2PMediaLoaderInfoHashes(playlist.playlistUrl, videoFiles) + playlist.p2pMediaLoaderPeerVersion = P2P_MEDIA_LOADER_PEER_VERSION + await playlist.save({ transaction: t }) + }) + } +} -async function updateMasterHLSPlaylist (video: VideoModel) { - const directory = join(HLS_PLAYLIST_DIRECTORY, video.uuid) +async function updateMasterHLSPlaylist (video: MVideoWithFile) { + const directory = join(HLS_STREAMING_PLAYLIST_DIRECTORY, video.uuid) const masterPlaylists: string[] = [ '#EXTM3U', '#EXT-X-VERSION:3' ] const masterPlaylistPath = join(directory, VideoStreamingPlaylistModel.getMasterHlsPlaylistFilename()) @@ -37,10 +55,10 @@ async function updateMasterHLSPlaylist (video: VideoModel) { await writeFile(masterPlaylistPath, masterPlaylists.join('\n') + '\n') } -async function updateSha256Segments (video: VideoModel) { +async function updateSha256Segments (video: MVideoWithFile) { const json: { [filename: string]: { [range: string]: string } } = {} - const playlistDirectory = join(HLS_PLAYLIST_DIRECTORY, video.uuid) + const playlistDirectory = join(HLS_STREAMING_PLAYLIST_DIRECTORY, video.uuid) // For all the resolutions available for this video for (const file of video.VideoFiles) { @@ -116,7 +134,8 @@ function downloadPlaylistSegments (playlistUrl: string, destinationDir: string, for (const fileUrl of fileUrls) { const destPath = join(tmpDirectory, basename(fileUrl)) - await doRequestAndSaveToFile({ uri: fileUrl }, destPath) + const bodyKBLimit = 10 * 1000 * 1000 // 10GB + await doRequestAndSaveToFile({ uri: fileUrl }, destPath, bodyKBLimit) } clearTimeout(timer) @@ -158,7 +177,8 @@ function downloadPlaylistSegments (playlistUrl: string, destinationDir: string, export { updateMasterHLSPlaylist, updateSha256Segments, - downloadPlaylistSegments + downloadPlaylistSegments, + updateStreamingPlaylistsInfohashesIfNeeded } // ---------------------------------------------------------------------------