+import { getActorsInvolvedInVideo, getAudienceFromFollowersOf, getRemoteVideoAudience } from '../audience'
+import { afterCommitIfTransaction } from '../../../helpers/database-utils'
+import { MActor, MActorId, MActorLight, MActorWithInboxes, MVideoAccountLight, MVideoId, MVideoImmutable } from '../../../types/models'
+import { getServerActor } from '@server/models/application/application'
+import { ContextType } from '@shared/models/activitypub/context'
+
+async function sendVideoRelatedActivity (activityBuilder: (audience: ActivityAudience) => Activity, options: {
+ byActor: MActorLight
+ video: MVideoImmutable | MVideoAccountLight
+ transaction?: Transaction
+ contextType?: ContextType
+}) {
+ const { byActor, video, transaction, contextType } = options
+
+ const actorsInvolvedInVideo = await getActorsInvolvedInVideo(video, transaction)
+
+ // Send to origin
+ if (video.isOwned() === false) {
+ const accountActor = (video as MVideoAccountLight).VideoChannel?.Account?.Actor || await ActorModel.loadAccountActorByVideoId(video.id)
+
+ const audience = getRemoteVideoAudience(accountActor, actorsInvolvedInVideo)
+ const activity = activityBuilder(audience)
+
+ return afterCommitIfTransaction(transaction, () => {
+ return unicastTo(activity, byActor, accountActor.getSharedInbox(), contextType)
+ })
+ }
+
+ // Send to followers
+ const audience = getAudienceFromFollowersOf(actorsInvolvedInVideo)
+ const activity = activityBuilder(audience)
+
+ const actorsException = [ byActor ]
+
+ return broadcastToFollowers(activity, byActor, actorsInvolvedInVideo, transaction, actorsException, contextType)
+}