X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Fvideo%2Fvideo-streaming-playlist.ts;h=73bd898445a5a2d8be54f38bf28d0595494e26d0;hb=bb4ba6d94c5051fdd665ebe63fffcc105778b8be;hp=bf6f7b0c4c465ca0a07a2f7bbcd41e7edb7f9b37;hpb=28f3d1b36a70426795240c9370e47b6c4ba847f8;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/video/video-streaming-playlist.ts b/server/models/video/video-streaming-playlist.ts index bf6f7b0c4..73bd89844 100644 --- a/server/models/video/video-streaming-playlist.ts +++ b/server/models/video/video-streaming-playlist.ts @@ -2,15 +2,27 @@ import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, HasMany, import { isVideoFileInfoHashValid } from '../../helpers/custom-validators/videos' import { throwIfNotValid } from '../utils' import { VideoModel } from './video' -import * as Sequelize from 'sequelize' import { VideoRedundancyModel } from '../redundancy/video-redundancy' import { VideoStreamingPlaylistType } from '../../../shared/models/videos/video-streaming-playlist.type' import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc' -import { CONSTRAINTS_FIELDS, STATIC_PATHS } from '../../initializers' -import { VideoFileModel } from './video-file' +import { + CONSTRAINTS_FIELDS, + MEMOIZE_LENGTH, + MEMOIZE_TTL, + P2P_MEDIA_LOADER_PEER_VERSION, + STATIC_DOWNLOAD_PATHS, + STATIC_PATHS +} from '../../initializers/constants' import { join } from 'path' import { sha1 } from '../../helpers/core-utils' import { isArrayOf } from '../../helpers/custom-validators/misc' +import { Op, QueryTypes } from 'sequelize' +import { MStreamingPlaylist, MStreamingPlaylistVideo, MVideoFile } from '@server/types/models' +import { VideoFileModel } from '@server/models/video/video-file' +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', @@ -49,6 +61,10 @@ export class VideoStreamingPlaylistModel extends Model throwIfNotValid(value, isActivityPubUrlValid, 'segments sha256 url')) @Column @@ -66,6 +82,14 @@ export class VideoStreamingPlaylistModel extends Model VideoFileModel, { + foreignKey: { + allowNull: true + }, + onDelete: 'CASCADE' + }) + VideoFiles: VideoFileModel[] + @HasMany(() => VideoRedundancyModel, { foreignKey: { allowNull: false @@ -75,31 +99,47 @@ export class VideoStreamingPlaylistModel extends Model { - return results.length === 1 - }) + return VideoModel.sequelize.query(query, options) + .then(results => results.length === 1) } - static buildP2PMediaLoaderInfoHashes (playlistUrl: string, videoFiles: VideoFileModel[]) { + static buildP2PMediaLoaderInfoHashes (playlistUrl: string, files: unknown[]) { const hashes: string[] = [] - // https://github.com/Novage/p2p-media-loader/blob/master/p2p-media-loader-core/lib/p2p-media-manager.ts#L97 - for (let i = 0; i < videoFiles.length; i++) { - hashes.push(sha1(`1${playlistUrl}+V${i}`)) + // https://github.com/Novage/p2p-media-loader/blob/master/p2p-media-loader-core/lib/p2p-media-manager.ts#L115 + for (let i = 0; i < files.length; i++) { + hashes.push(sha1(`${P2P_MEDIA_LOADER_PEER_VERSION}${playlistUrl}+V${i}`)) } return hashes } + static listByIncorrectPeerVersion () { + const query = { + where: { + p2pMediaLoaderPeerVersion: { + [Op.ne]: P2P_MEDIA_LOADER_PEER_VERSION + } + } + } + + return VideoStreamingPlaylistModel.findAll(query) + } + static loadWithVideo (id: number) { const options = { include: [ @@ -110,7 +150,18 @@ export class VideoStreamingPlaylistModel extends Model logger.warn('Cannot delete torrent %s.', torrentPath, { err })) + } }