import { Hooks } from '@server/lib/plugins/hooks'
import { getServerActor } from '@server/models/application/application'
import { MVideoPlaylistFull, MVideoPlaylistThumbnail, MVideoThumbnail } from '@server/types/models'
+import { forceNumber } from '@shared/core-utils'
import { uuidToShort } from '@shared/extra-utils'
import { VideoPlaylistCreateResult, VideoPlaylistElementCreateResult } from '@shared/models'
import { HttpStatusCode } from '../../../shared/models/http/http-error-codes'
import { AccountModel } from '../../models/account/account'
import { VideoPlaylistModel } from '../../models/video/video-playlist'
import { VideoPlaylistElementModel } from '../../models/video/video-playlist-element'
-import { forceNumber } from '@shared/core-utils'
const reqThumbnailFile = createReqFiles([ 'thumbnailfile' ], MIMETYPES.IMAGE.MIMETYPE_EXT)
const endOldPosition = oldPosition + reorderLength - 1
// Insert our reordered elements in their place (update)
- await VideoPlaylistElementModel.reassignPositionOf({ videoPlaylistId: videoPlaylist.id, firstPosition: oldPosition, endPosition: endOldPosition, newPosition, transaction: t })
+ await VideoPlaylistElementModel.reassignPositionOf({
+ videoPlaylistId: videoPlaylist.id,
+ firstPosition: oldPosition,
+ endPosition: endOldPosition,
+ newPosition,
+ transaction: t
+ })
// Decrease positions of elements after the old position of our ordered elements (decrease)
await VideoPlaylistElementModel.increasePositionOf(videoPlaylist.id, oldPosition, -reorderLength, t)
// The file exists
const file = fileArray[0]
- if (!file || !file.originalname) return false
+ if (!file?.originalname) return false
// Check size
if ((maxSize !== null) && file.size > maxSize) return false
return execPromise(`${ffmpegPath} -version`)
.then(stdout => {
const parsed = stdout.match(/ffmpeg version .?(\d+\.\d+(\.\d+)?)/)
- if (!parsed || !parsed[1]) return rej(new Error(`Could not find ffmpeg version in ${stdout}`))
+ if (!parsed?.[1]) return rej(new Error(`Could not find ffmpeg version in ${stdout}`))
// Fix ffmpeg version that does not include patch version (4.4 for example)
let version = parsed[1]
const subtitles = files.reduce((acc, filename) => {
const matched = filename.match(/\.([a-z]{2})(-[a-z]+)?\.(vtt|ttml)/i)
- if (!matched || !matched[1]) return acc
+ if (!matched?.[1]) return acc
return [
...acc,
height: 480,
minWidth: 400
}
-const ACTOR_IMAGES_SIZE: { [key in ActorImageType]: { width: number, height: number }[]} = {
+const ACTOR_IMAGES_SIZE: { [key in ActorImageType]: { width: number, height: number }[] } = {
[ActorImageType.AVATAR]: [
{
width: 120,
async function addVideoShare (shareUrl: string, video: MVideoId) {
const { body } = await doJSONRequest<any>(shareUrl, { activityPub: true })
- if (!body || !body.actor) throw new Error('Body or body actor is invalid')
+ if (!body?.actor) throw new Error('Body or body actor is invalid')
const actorUrl = getAPId(body.actor)
if (checkUrlsSameHost(shareUrl, actorUrl) !== true) {
const { body } = await doJSONRequest<any>(url, { activityPub: true })
// If not same id, check same host and update
- if (!body || !body.id || !bodyValidator(body)) throw new Error(`Body or body id of ${url} is invalid`)
+ if (!body?.id || !bodyValidator(body)) throw new Error(`Body or body id of ${url} is invalid`)
if (body.type === 'Tombstone') {
return on404OrTombstone()
async function getVideoImportOrDie (payload: VideoImportPayload) {
const videoImport = await VideoImportModel.loadAndPopulateVideo(payload.videoImportId)
- if (!videoImport || !videoImport.Video) {
+ if (!videoImport?.Video) {
throw new Error(`Cannot import video ${payload.videoImportId}: the video import or video linked to this import does not exist anymore.`)
}
base: FilteredModelAttributes<AbuseModel>
reporterAccount: MAccountDefault
flaggedAccount: MAccountLight
- associateFun: (abuseInstance: MAbuseFull) => Promise<{ isOwned: boolean} >
+ associateFun: (abuseInstance: MAbuseFull) => Promise<{ isOwned: boolean }>
skipNotification: boolean
transaction: Transaction
}) {
const chunks = chunk(plugins, 10)
for (const chunk of chunks) {
// Find plugins according to their npm name
- const pluginIndex: { [npmName: string]: PluginModel} = {}
+ const pluginIndex: { [npmName: string]: PluginModel } = {}
for (const plugin of chunk) {
pluginIndex[PluginModel.buildNpmName(plugin.name, plugin.type)] = plugin
}
return wrapWithSpanAndContext('peertube.activitypub.JSONLDSignature', async () => {
const signatureObject: ActivityPubSignature = req.body.signature
- if (!signatureObject || !signatureObject.creator) {
+ if (!signatureObject?.creator) {
res.fail({
status: HttpStatusCode.FORBIDDEN_403,
message: 'Object and creator signature do not match'
-import { arrayify } from '@shared/core-utils'
import express from 'express'
import { body, param, query } from 'express-validator'
+import { arrayify } from '@shared/core-utils'
import { HttpStatusCode } from '../../../shared/models/http/http-error-codes'
import { areValidActorHandles, isValidActorHandle } from '../../helpers/custom-validators/activitypub/actor'
import { WEBSERVER } from '../../initializers/constants'
state: 'accepted'
})
- if (!subscription || !subscription.ActorFollowing.VideoChannel) {
+ if (!subscription?.ActorFollowing.VideoChannel) {
return res.fail({
status: HttpStatusCode.NOT_FOUND_404,
message: `Subscription ${req.params.uri} not found.`
buildBaseVideoCommentAbuse (this: MAbuseUserFormattable) {
// Associated video comment could have been destroyed if the video has been deleted
- if (!this.VideoCommentAbuse || !this.VideoCommentAbuse.VideoComment) return null
+ if (!this.VideoCommentAbuse?.VideoComment) return null
const entity = this.VideoCommentAbuse.VideoComment
return PluginModel.findOne(query)
.then(p => {
- if (!p || !p.settings || p.settings === undefined) {
+ if (!p?.settings || p.settings === undefined) {
const registered = registeredSettings.find(s => s.name === settingName)
if (!registered || registered.default === undefined) return undefined
const result: SettingEntries = {}
for (const name of settingNames) {
- if (!p || !p.settings || p.settings[name] === undefined) {
+ if (!p?.settings || p.settings[name] === undefined) {
const registered = registeredSettings.find(s => s.name === name)
if (registered?.default !== undefined) {
}
function guessAdditionalAttributesFromQuery (query: VideosCommonQueryAfterSanitize): VideoFormattingJSONOptions {
- if (!query || !query.include) return {}
+ if (!query?.include) return {}
return {
additionalAttributes: {
}
protected buildAttributesObject (prefixKey: string, attributeKeys: string[]) {
- const result: { [id: string]: string} = {}
+ const result: { [id: string]: string } = {}
const prefixValue = prefixKey.replace(/->/g, '.')
})
it('Should correctly fast reastream in a permanent live with and without save replay', async function () {
- this.timeout(240000)
+ this.timeout(480000)
// A test can take a long time, so prefer to run them in parallel
await Promise.all([
}
export function peertubeTranslate (str: string, translations?: { [ id: string ]: string }) {
- if (!translations || !translations[str]) return str
+ if (!translations?.[str]) return str
return translations[str]
}
const onPeerTubeExit = () => rej(new Error('Process exited:\n' + aggregatedLogs))
const onParentExit = () => {
- if (!this.app || !this.app.pid) return
+ if (!this.app?.pid) return
try {
process.kill(self.app.pid)