Fix mime type handling from remote instances

pull/5992/head
Chocobozzz 2023-10-04 09:59:27 +02:00
parent fbc7f1a00d
commit d0f8a0e677
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
6 changed files with 30 additions and 19 deletions

View File

@ -9,9 +9,9 @@
</tr>
<tr>
<th i18n class="label" scope="row">
<div>Default NSFW/sensitive videos policy</div>
<span class="fs-7 fw-normal fst-italic">can be redefined by the users</span>
<th class="label" scope="row">
<div i18n>Default NSFW/sensitive videos policy</div>
<span i18n class="fs-7 fw-normal fst-italic">can be redefined by the users</span>
</th>
<td class="value">{{ buildNSFWLabel() }}</td>

View File

@ -16,7 +16,7 @@ export interface ActivityIconObject {
export type ActivityVideoUrlObject = {
type: 'Link'
mediaType: 'video/mp4' | 'video/webm' | 'video/ogg'
mediaType: 'video/mp4' | 'video/webm' | 'video/ogg' | 'audio/mp4'
href: string
height: number
size: number

View File

@ -8,7 +8,7 @@ import {
VideoState
} from '@peertube/peertube-models'
import { logger } from '@server/helpers/logger.js'
import { ACTIVITY_PUB, CONSTRAINTS_FIELDS } from '../../../initializers/constants.js'
import { CONSTRAINTS_FIELDS, MIMETYPES } from '../../../initializers/constants.js'
import { peertubeTruncate } from '../../core-utils.js'
import { isArray, isBooleanValid, isDateValid, isUUIDValid } from '../misc.js'
import { isLiveLatencyModeValid } from '../video-lives.js'
@ -91,7 +91,7 @@ function isRemoteVideoUrlValid (url: any) {
return url.type === 'Link' &&
// Video file link
(
ACTIVITY_PUB.URL_MIME_TYPES.VIDEO.includes(url.mediaType) &&
MIMETYPES.AP_VIDEO.MIMETYPE_EXT[url.mediaType] &&
isActivityPubUrlValid(url.href) &&
validator.default.isInt(url.height + '', { min: 0 }) &&
validator.default.isInt(url.size + '', { min: 0 }) &&
@ -99,13 +99,13 @@ function isRemoteVideoUrlValid (url: any) {
) ||
// Torrent link
(
ACTIVITY_PUB.URL_MIME_TYPES.TORRENT.includes(url.mediaType) &&
MIMETYPES.AP_TORRENT.MIMETYPE_EXT[url.mediaType] &&
isActivityPubUrlValid(url.href) &&
validator.default.isInt(url.height + '', { min: 0 })
) ||
// Magnet link
(
ACTIVITY_PUB.URL_MIME_TYPES.MAGNET.includes(url.mediaType) &&
MIMETYPES.AP_MAGNET.MIMETYPE_EXT[url.mediaType] &&
validator.default.isLength(url.href, { min: 5 }) &&
validator.default.isInt(url.height + '', { min: 0 })
) ||

View File

@ -672,8 +672,27 @@ const MIMETYPES = {
MIMETYPE_EXT: {
'application/vnd.apple.mpegurl': '.m3u8'
}
},
AP_VIDEO: {
MIMETYPE_EXT: {
'video/mp4': '.mp4',
'video/ogg': '.ogv',
'video/webm': '.webm',
'audio/mp4': '.mp4'
}
},
AP_TORRENT: {
MIMETYPE_EXT: {
'application/x-bittorrent': '.torrent'
}
},
AP_MAGNET: {
MIMETYPE_EXT: {
'application/x-bittorrent;x-scheme-handler/magnet': '.magnet'
}
}
}
MIMETYPES.AUDIO.EXT_MIMETYPE = invert(MIMETYPES.AUDIO.MIMETYPE_EXT)
MIMETYPES.IMAGE.EXT_MIMETYPE = invert(MIMETYPES.IMAGE.MIMETYPE_EXT)
MIMETYPES.VIDEO_CAPTIONS.EXT_MIMETYPE = invert(MIMETYPES.VIDEO_CAPTIONS.MIMETYPE_EXT)
@ -707,11 +726,6 @@ const ACTIVITY_PUB = {
PUBLIC: 'https://www.w3.org/ns/activitystreams#Public',
COLLECTION_ITEMS_PER_PAGE: 10,
FETCH_PAGE_LIMIT: 2000,
URL_MIME_TYPES: {
VIDEO: [] as string[],
TORRENT: [ 'application/x-bittorrent' ],
MAGNET: [ 'application/x-bittorrent;x-scheme-handler/magnet' ]
},
MAX_RECURSION_COMMENTS: 100,
ACTOR_REFRESH_INTERVAL: 3600 * 24 * 1000 * 2, // 2 days
VIDEO_REFRESH_INTERVAL: 3600 * 24 * 1000 * 2, // 2 days
@ -1313,8 +1327,6 @@ function updateWebserverConfig () {
MIMETYPES.VIDEO.MIMETYPE_EXT = buildVideoMimetypeExt()
MIMETYPES.VIDEO.MIMETYPES_REGEX = buildMimetypesRegex(MIMETYPES.VIDEO.MIMETYPE_EXT)
ACTIVITY_PUB.URL_MIME_TYPES.VIDEO = Object.keys(MIMETYPES.VIDEO.MIMETYPE_EXT)
MIMETYPES.VIDEO.EXT_MIMETYPE = buildVideoExtMimetype(MIMETYPES.VIDEO.MIMETYPE_EXT)
CONSTRAINTS_FIELDS.VIDEOS.EXTNAME = Object.keys(MIMETYPES.VIDEO.EXT_MIMETYPE)

View File

@ -264,9 +264,7 @@ export {
// ---------------------------------------------------------------------------
function isAPVideoUrlObject (url: any): url is ActivityVideoUrlObject {
const urlMediaType = url.mediaType
return MIMETYPES.VIDEO.MIMETYPE_EXT[urlMediaType] && urlMediaType.startsWith('video/')
return !!MIMETYPES.AP_VIDEO.MIMETYPE_EXT[url.mediaType]
}
function isAPStreamingPlaylistUrlObject (url: any): url is ActivityPlaylistUrlObject {

View File

@ -181,7 +181,8 @@ function buildVideoFileUrls (options: {
.sort(sortByResolutionDesc)
for (const file of sortedFiles) {
const mimeType = getVideoFileMimeType(file.extname, file.isAudio())
// FIXME: Replace false by file.isAudio(), federation breaking change correctly handled in 6.0
const mimeType = getVideoFileMimeType(file.extname, false)
urls.push({
type: 'Link',