+async function blacklistVideo (videoInstance: MVideoAccountLight, options: VideoBlacklistCreate) {
+ const blacklist: MVideoBlacklistVideo = await VideoBlacklistModel.create({
+ videoId: videoInstance.id,
+ unfederated: options.unfederate === true,
+ reason: options.reason,
+ type: VideoBlacklistType.MANUAL
+ }
+ )
+ blacklist.Video = videoInstance
+
+ if (options.unfederate === true) {
+ await sendDeleteVideo(videoInstance, undefined)
+ }
+
+ if (videoInstance.isLive) {
+ LiveManager.Instance.stopSessionOf(videoInstance.id)
+ }
+
+ Notifier.Instance.notifyOnVideoBlacklist(blacklist)
+}
+
+async function unblacklistVideo (videoBlacklist: MVideoBlacklist, video: MVideoFullLight) {
+ const videoBlacklistType = await sequelizeTypescript.transaction(async t => {
+ const unfederated = videoBlacklist.unfederated
+ const videoBlacklistType = videoBlacklist.type
+
+ await videoBlacklist.destroy({ transaction: t })
+ video.VideoBlacklist = undefined
+
+ // Re federate the video
+ if (unfederated === true) {
+ await federateVideoIfNeeded(video, true, t)
+ }
+
+ return videoBlacklistType
+ })
+
+ Notifier.Instance.notifyOnVideoUnblacklist(video)
+
+ if (videoBlacklistType === VideoBlacklistType.AUTO_BEFORE_PUBLISHED) {
+ Notifier.Instance.notifyOnVideoPublishedAfterRemovedFromAutoBlacklist(video)
+
+ // Delete on object so new video notifications will send
+ delete video.VideoBlacklist
+ Notifier.Instance.notifyOnNewVideoIfNeeded(video)
+ }
+}
+
+// ---------------------------------------------------------------------------
+
+export {
+ autoBlacklistVideoIfNeeded,
+ blacklistVideo,
+ unblacklistVideo
+}
+
+// ---------------------------------------------------------------------------
+
+function autoBlacklistNeeded (parameters: {
+ video: MVideoWithBlacklistLight
+ isRemote: boolean
+ isNew: boolean