X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=server%2Fmodels%2Fvideo%2Fvideo.ts;h=a4093ce3ba9aba83f2cf0f0d3b0c23be6644b99e;hb=242f52253e46ce0ffd7349cb06bcd887bb89cf06;hp=1050463d20dd7dba28c4a8f03364efd0c9e47891;hpb=6ba93fa6392429f22d338f3cdce50707995ced3b;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/video/video.ts b/server/models/video/video.ts index 1050463d2..a4093ce3b 100644 --- a/server/models/video/video.ts +++ b/server/models/video/video.ts @@ -25,7 +25,6 @@ import { UpdatedAt } from 'sequelize-typescript' import { buildNSFWFilter } from '@server/helpers/express-utils' -import { uuidToShort } from '@server/helpers/uuid' import { getPrivaciesForFederation, isPrivacyForFederation, isStateForFederation } from '@server/helpers/video' import { LiveManager } from '@server/lib/live/live-manager' import { removeHLSObjectStorage, removeWebTorrentObjectStorage } from '@server/lib/object-storage' @@ -33,13 +32,24 @@ import { getHLSDirectory, getHLSRedundancyDirectory } from '@server/lib/paths' import { VideoPathManager } from '@server/lib/video-path-manager' import { getServerActor } from '@server/models/application/application' import { ModelCache } from '@server/models/model-cache' -import { AttributesOnly, buildVideoEmbedPath, buildVideoWatchPath, pick } from '@shared/core-utils' -import { VideoFile, VideoInclude } from '@shared/models' -import { ResultList, UserRight, VideoPrivacy, VideoState } from '../../../shared' -import { VideoObject } from '../../../shared/models/activitypub/objects' -import { Video, VideoDetails, VideoRateType, VideoStorage } from '../../../shared/models/videos' -import { ThumbnailType } from '../../../shared/models/videos/thumbnail.type' -import { VideoStreamingPlaylistType } from '../../../shared/models/videos/video-streaming-playlist.type' +import { buildVideoEmbedPath, buildVideoWatchPath, pick } from '@shared/core-utils' +import { ffprobePromise, getAudioStream, uuidToShort } from '@shared/extra-utils' +import { + ResultList, + ThumbnailType, + UserRight, + Video, + VideoDetails, + VideoFile, + VideoInclude, + VideoObject, + VideoPrivacy, + VideoRateType, + VideoState, + VideoStorage, + VideoStreamingPlaylistType +} from '@shared/models' +import { AttributesOnly } from '@shared/typescript-utils' import { peertubeTruncate } from '../../helpers/core-utils' import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc' import { exists, isBooleanValid } from '../../helpers/custom-validators/misc' @@ -51,7 +61,7 @@ import { isVideoStateValid, isVideoSupportValid } from '../../helpers/custom-validators/videos' -import { getVideoFileResolution } from '../../helpers/ffprobe-utils' +import { getVideoStreamDimensionsInfo } from '../../helpers/ffmpeg' import { logger } from '../../helpers/logger' import { CONFIG } from '../../initializers/config' import { ACTIVITY_PUB, API_VERSION, CONSTRAINTS_FIELDS, LAZY_STATIC_PATHS, STATIC_PATHS, WEBSERVER } from '../../initializers/constants' @@ -104,9 +114,13 @@ import { videoModelToFormattedJSON } from './formatter/video-format-utils' import { ScheduleVideoUpdateModel } from './schedule-video-update' -import { VideoModelGetQueryBuilder } from './sql/video-model-get-query-builder' -import { BuildVideosListQueryOptions, DisplayOnlyForFollowerOptions, VideosIdListQueryBuilder } from './sql/videos-id-list-query-builder' -import { VideosModelListQueryBuilder } from './sql/videos-model-list-query-builder' +import { + BuildVideosListQueryOptions, + DisplayOnlyForFollowerOptions, + VideoModelGetQueryBuilder, + VideosIdListQueryBuilder, + VideosModelListQueryBuilder +} from './sql/video' import { TagModel } from './tag' import { ThumbnailModel } from './thumbnail' import { VideoBlacklistModel } from './video-blacklist' @@ -219,8 +233,8 @@ export type ForAPIOptions = { required: false }, { - model: ActorImageModel.unscoped(), - as: 'Avatar', + model: ActorImageModel, + as: 'Avatars', required: false } ] @@ -242,8 +256,8 @@ export type ForAPIOptions = { required: false }, { - model: ActorImageModel.unscoped(), - as: 'Avatar', + model: ActorImageModel, + as: 'Avatars', required: false } ] @@ -1478,7 +1492,8 @@ export class VideoModel extends Model>> { required: false, where: { startDate: { - [Op.gte]: new Date(new Date().getTime() - (24 * 3600 * 1000) * trendingDays) + // FIXME: ts error + [Op.gte as any]: new Date(new Date().getTime() - (24 * 3600 * 1000) * trendingDays) } } } @@ -1668,12 +1683,20 @@ export class VideoModel extends Model>> { return peertubeTruncate(this.description, { length: maxLength }) } - getMaxQualityResolution () { + probeMaxQualityFile () { const file = this.getMaxQualityFile() const videoOrPlaylist = file.getVideoOrStreamingPlaylist() - return VideoPathManager.Instance.makeAvailableVideoFile(file.withVideoOrPlaylist(videoOrPlaylist), originalFilePath => { - return getVideoFileResolution(originalFilePath) + return VideoPathManager.Instance.makeAvailableVideoFile(file.withVideoOrPlaylist(videoOrPlaylist), async originalFilePath => { + const probe = await ffprobePromise(originalFilePath) + + const { audioStream } = await getAudioStream(originalFilePath, probe) + + return { + audioStream, + + ...await getVideoStreamDimensionsInfo(originalFilePath, probe) + } }) }