videos.ts 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import { values } from 'lodash'
  2. import validator from 'validator'
  3. import { VideoFilter, VideoPrivacy, VideoRateType } from '../../../shared'
  4. import {
  5. CONSTRAINTS_FIELDS,
  6. MIMETYPES,
  7. VIDEO_CATEGORIES,
  8. VIDEO_LICENCES,
  9. VIDEO_PRIVACIES,
  10. VIDEO_RATE_TYPES,
  11. VIDEO_STATES
  12. } from '../../initializers/constants'
  13. import { exists, isArray, isDateValid, isFileValid } from './misc'
  14. import * as magnetUtil from 'magnet-uri'
  15. const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
  16. function isVideoFilterValid (filter: VideoFilter) {
  17. return filter === 'local' || filter === 'all-local'
  18. }
  19. function isVideoCategoryValid (value: any) {
  20. return value === null || VIDEO_CATEGORIES[value] !== undefined
  21. }
  22. function isVideoStateValid (value: any) {
  23. return exists(value) && VIDEO_STATES[value] !== undefined
  24. }
  25. function isVideoLicenceValid (value: any) {
  26. return value === null || VIDEO_LICENCES[value] !== undefined
  27. }
  28. function isVideoLanguageValid (value: any) {
  29. return value === null ||
  30. (typeof value === 'string' && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.LANGUAGE))
  31. }
  32. function isVideoDurationValid (value: string) {
  33. return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.DURATION)
  34. }
  35. function isVideoTruncatedDescriptionValid (value: string) {
  36. return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.TRUNCATED_DESCRIPTION)
  37. }
  38. function isVideoDescriptionValid (value: string) {
  39. return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.DESCRIPTION))
  40. }
  41. function isVideoSupportValid (value: string) {
  42. return value === null || (exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.SUPPORT))
  43. }
  44. function isVideoNameValid (value: string) {
  45. return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.NAME)
  46. }
  47. function isVideoTagValid (tag: string) {
  48. return exists(tag) && validator.isLength(tag, VIDEOS_CONSTRAINTS_FIELDS.TAG)
  49. }
  50. function isVideoTagsValid (tags: string[]) {
  51. return tags === null || (
  52. isArray(tags) &&
  53. validator.isInt(tags.length.toString(), VIDEOS_CONSTRAINTS_FIELDS.TAGS) &&
  54. tags.every(tag => isVideoTagValid(tag))
  55. )
  56. }
  57. function isVideoViewsValid (value: string) {
  58. return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.VIEWS)
  59. }
  60. function isVideoRatingTypeValid (value: string) {
  61. return value === 'none' || values(VIDEO_RATE_TYPES).indexOf(value as VideoRateType) !== -1
  62. }
  63. function isVideoFileExtnameValid (value: string) {
  64. return exists(value) && MIMETYPES.VIDEO.EXT_MIMETYPE[value] !== undefined
  65. }
  66. function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) {
  67. const videoFileTypesRegex = Object.keys(MIMETYPES.VIDEO.MIMETYPE_EXT)
  68. .map(m => `(${m})`)
  69. .join('|')
  70. return isFileValid(files, videoFileTypesRegex, 'videofile', null)
  71. }
  72. const videoImageTypes = CONSTRAINTS_FIELDS.VIDEOS.IMAGE.EXTNAME
  73. .map(v => v.replace('.', ''))
  74. .join('|')
  75. const videoImageTypesRegex = `image/(${videoImageTypes})`
  76. function isVideoImage (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[], field: string) {
  77. return isFileValid(files, videoImageTypesRegex, field, CONSTRAINTS_FIELDS.VIDEOS.IMAGE.FILE_SIZE.max, true)
  78. }
  79. function isVideoPrivacyValid (value: number) {
  80. return VIDEO_PRIVACIES[value] !== undefined
  81. }
  82. function isScheduleVideoUpdatePrivacyValid (value: number) {
  83. return value === VideoPrivacy.UNLISTED || value === VideoPrivacy.PUBLIC || value === VideoPrivacy.INTERNAL
  84. }
  85. function isVideoOriginallyPublishedAtValid (value: string | null) {
  86. return value === null || isDateValid(value)
  87. }
  88. function isVideoFileInfoHashValid (value: string | null | undefined) {
  89. return exists(value) && validator.isLength(value, VIDEOS_CONSTRAINTS_FIELDS.INFO_HASH)
  90. }
  91. function isVideoFileResolutionValid (value: string) {
  92. return exists(value) && validator.isInt(value + '')
  93. }
  94. function isVideoFPSResolutionValid (value: string) {
  95. return value === null || validator.isInt(value + '')
  96. }
  97. function isVideoFileSizeValid (value: string) {
  98. return exists(value) && validator.isInt(value + '', VIDEOS_CONSTRAINTS_FIELDS.FILE_SIZE)
  99. }
  100. function isVideoMagnetUriValid (value: string) {
  101. if (!exists(value)) return false
  102. const parsed = magnetUtil.decode(value)
  103. return parsed && isVideoFileInfoHashValid(parsed.infoHash)
  104. }
  105. // ---------------------------------------------------------------------------
  106. export {
  107. isVideoCategoryValid,
  108. isVideoLicenceValid,
  109. isVideoLanguageValid,
  110. isVideoTruncatedDescriptionValid,
  111. isVideoDescriptionValid,
  112. isVideoFileInfoHashValid,
  113. isVideoNameValid,
  114. isVideoTagsValid,
  115. isVideoFPSResolutionValid,
  116. isScheduleVideoUpdatePrivacyValid,
  117. isVideoOriginallyPublishedAtValid,
  118. isVideoFile,
  119. isVideoMagnetUriValid,
  120. isVideoStateValid,
  121. isVideoViewsValid,
  122. isVideoRatingTypeValid,
  123. isVideoFileExtnameValid,
  124. isVideoDurationValid,
  125. isVideoTagValid,
  126. isVideoPrivacyValid,
  127. isVideoFileResolutionValid,
  128. isVideoFileSizeValid,
  129. isVideoImage,
  130. isVideoSupportValid,
  131. isVideoFilterValid
  132. }