server-config.model.ts 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. import { ClientScriptJSON } from '../plugins/plugin-package-json.model.js'
  2. import { NSFWPolicyType } from '../videos/nsfw-policy.type.js'
  3. import { VideoPrivacyType } from '../videos/video-privacy.enum.js'
  4. import { BroadcastMessageLevel } from './broadcast-message-level.type.js'
  5. export interface ServerConfigPlugin {
  6. name: string
  7. npmName: string
  8. version: string
  9. description: string
  10. clientScripts: { [name: string]: ClientScriptJSON }
  11. }
  12. export interface ServerConfigTheme extends ServerConfigPlugin {
  13. css: string[]
  14. }
  15. export interface RegisteredExternalAuthConfig {
  16. npmName: string
  17. name: string
  18. version: string
  19. authName: string
  20. authDisplayName: string
  21. }
  22. export interface RegisteredIdAndPassAuthConfig {
  23. npmName: string
  24. name: string
  25. version: string
  26. authName: string
  27. weight: number
  28. }
  29. export interface ServerConfig {
  30. serverVersion: string
  31. serverCommit?: string
  32. client: {
  33. videos: {
  34. miniature: {
  35. displayAuthorAvatar: boolean
  36. preferAuthorDisplayName: boolean
  37. }
  38. resumableUpload: {
  39. maxChunkSize: number
  40. }
  41. }
  42. menu: {
  43. login: {
  44. redirectOnSingleExternalAuth: boolean
  45. }
  46. }
  47. }
  48. defaults: {
  49. publish: {
  50. downloadEnabled: boolean
  51. commentsEnabled: boolean
  52. privacy: VideoPrivacyType
  53. licence: number
  54. }
  55. p2p: {
  56. webapp: {
  57. enabled: boolean
  58. }
  59. embed: {
  60. enabled: boolean
  61. }
  62. }
  63. }
  64. webadmin: {
  65. configuration: {
  66. edition: {
  67. allowed: boolean
  68. }
  69. }
  70. }
  71. instance: {
  72. name: string
  73. shortDescription: string
  74. isNSFW: boolean
  75. defaultNSFWPolicy: NSFWPolicyType
  76. defaultClientRoute: string
  77. customizations: {
  78. javascript: string
  79. css: string
  80. }
  81. }
  82. search: {
  83. remoteUri: {
  84. users: boolean
  85. anonymous: boolean
  86. }
  87. searchIndex: {
  88. enabled: boolean
  89. url: string
  90. disableLocalSearch: boolean
  91. isDefaultSearch: boolean
  92. }
  93. }
  94. plugin: {
  95. registered: ServerConfigPlugin[]
  96. registeredExternalAuths: RegisteredExternalAuthConfig[]
  97. registeredIdAndPassAuths: RegisteredIdAndPassAuthConfig[]
  98. }
  99. theme: {
  100. registered: ServerConfigTheme[]
  101. default: string
  102. }
  103. email: {
  104. enabled: boolean
  105. }
  106. contactForm: {
  107. enabled: boolean
  108. }
  109. signup: {
  110. allowed: boolean
  111. allowedForCurrentIP: boolean
  112. requiresEmailVerification: boolean
  113. requiresApproval: boolean
  114. minimumAge: number
  115. }
  116. transcoding: {
  117. hls: {
  118. enabled: boolean
  119. }
  120. web_videos: {
  121. enabled: boolean
  122. }
  123. enabledResolutions: number[]
  124. profile: string
  125. availableProfiles: string[]
  126. remoteRunners: {
  127. enabled: boolean
  128. }
  129. }
  130. live: {
  131. enabled: boolean
  132. allowReplay: boolean
  133. latencySetting: {
  134. enabled: boolean
  135. }
  136. maxDuration: number
  137. maxInstanceLives: number
  138. maxUserLives: number
  139. transcoding: {
  140. enabled: boolean
  141. remoteRunners: {
  142. enabled: boolean
  143. }
  144. enabledResolutions: number[]
  145. profile: string
  146. availableProfiles: string[]
  147. }
  148. rtmp: {
  149. port: number
  150. }
  151. }
  152. videoStudio: {
  153. enabled: boolean
  154. remoteRunners: {
  155. enabled: boolean
  156. }
  157. }
  158. videoFile: {
  159. update: {
  160. enabled: boolean
  161. }
  162. }
  163. import: {
  164. videos: {
  165. http: {
  166. enabled: boolean
  167. }
  168. torrent: {
  169. enabled: boolean
  170. }
  171. }
  172. videoChannelSynchronization: {
  173. enabled: boolean
  174. }
  175. users: {
  176. enabled:boolean
  177. }
  178. }
  179. export: {
  180. users: {
  181. enabled: boolean
  182. exportExpiration: number
  183. maxUserVideoQuota: number
  184. }
  185. }
  186. autoBlacklist: {
  187. videos: {
  188. ofUsers: {
  189. enabled: boolean
  190. }
  191. }
  192. }
  193. avatar: {
  194. file: {
  195. size: {
  196. max: number
  197. }
  198. extensions: string[]
  199. }
  200. }
  201. banner: {
  202. file: {
  203. size: {
  204. max: number
  205. }
  206. extensions: string[]
  207. }
  208. }
  209. video: {
  210. image: {
  211. size: {
  212. max: number
  213. }
  214. extensions: string[]
  215. }
  216. file: {
  217. extensions: string[]
  218. }
  219. }
  220. videoCaption: {
  221. file: {
  222. size: {
  223. max: number
  224. }
  225. extensions: string[]
  226. }
  227. }
  228. user: {
  229. videoQuota: number
  230. videoQuotaDaily: number
  231. }
  232. videoChannels: {
  233. maxPerUser: number
  234. }
  235. trending: {
  236. videos: {
  237. intervalDays: number
  238. algorithms: {
  239. enabled: string[]
  240. default: string
  241. }
  242. }
  243. }
  244. tracker: {
  245. enabled: boolean
  246. }
  247. followings: {
  248. instance: {
  249. autoFollowIndex: {
  250. indexUrl: string
  251. }
  252. }
  253. }
  254. broadcastMessage: {
  255. enabled: boolean
  256. message: string
  257. level: BroadcastMessageLevel
  258. dismissable: boolean
  259. }
  260. homepage: {
  261. enabled: boolean
  262. }
  263. openTelemetry: {
  264. metrics: {
  265. enabled: boolean
  266. // milliseconds
  267. playbackStatsInterval: number
  268. }
  269. }
  270. views: {
  271. videos: {
  272. watchingInterval: {
  273. // milliseconds
  274. anonymous: number
  275. // milliseconds
  276. users: number
  277. }
  278. }
  279. }
  280. storyboards: {
  281. enabled: boolean
  282. }
  283. }
  284. export type HTMLServerConfig = Omit<ServerConfig, 'signup'>