diff options
Diffstat (limited to 'server/lib/video-privacy.ts')
-rw-r--r-- | server/lib/video-privacy.ts | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/server/lib/video-privacy.ts b/server/lib/video-privacy.ts new file mode 100644 index 000000000..41f9d62b3 --- /dev/null +++ b/server/lib/video-privacy.ts | |||
@@ -0,0 +1,127 @@ | |||
1 | import { move } from 'fs-extra' | ||
2 | import { join } from 'path' | ||
3 | import { logger } from '@server/helpers/logger' | ||
4 | import { DIRECTORIES } from '@server/initializers/constants' | ||
5 | import { MVideo, MVideoFile, MVideoFullLight } from '@server/types/models' | ||
6 | import { VideoPrivacy, VideoStorage } from '@shared/models' | ||
7 | import { updateHLSFilesACL, updateWebTorrentFileACL } from './object-storage' | ||
8 | |||
9 | function setVideoPrivacy (video: MVideo, newPrivacy: VideoPrivacy) { | ||
10 | if (video.privacy === VideoPrivacy.PRIVATE && newPrivacy !== VideoPrivacy.PRIVATE) { | ||
11 | video.publishedAt = new Date() | ||
12 | } | ||
13 | |||
14 | video.privacy = newPrivacy | ||
15 | } | ||
16 | |||
17 | function isVideoInPrivateDirectory (privacy: VideoPrivacy) { | ||
18 | return privacy === VideoPrivacy.PRIVATE || privacy === VideoPrivacy.INTERNAL | ||
19 | } | ||
20 | |||
21 | function isVideoInPublicDirectory (privacy: VideoPrivacy) { | ||
22 | return !isVideoInPrivateDirectory(privacy) | ||
23 | } | ||
24 | |||
25 | async function moveFilesIfPrivacyChanged (video: MVideoFullLight, oldPrivacy: VideoPrivacy) { | ||
26 | // Now public, previously private | ||
27 | if (isVideoInPublicDirectory(video.privacy) && isVideoInPrivateDirectory(oldPrivacy)) { | ||
28 | await moveFiles({ type: 'private-to-public', video }) | ||
29 | |||
30 | return true | ||
31 | } | ||
32 | |||
33 | // Now private, previously public | ||
34 | if (isVideoInPrivateDirectory(video.privacy) && isVideoInPublicDirectory(oldPrivacy)) { | ||
35 | await moveFiles({ type: 'public-to-private', video }) | ||
36 | |||
37 | return true | ||
38 | } | ||
39 | |||
40 | return false | ||
41 | } | ||
42 | |||
43 | export { | ||
44 | setVideoPrivacy, | ||
45 | |||
46 | isVideoInPrivateDirectory, | ||
47 | isVideoInPublicDirectory, | ||
48 | |||
49 | moveFilesIfPrivacyChanged | ||
50 | } | ||
51 | |||
52 | // --------------------------------------------------------------------------- | ||
53 | |||
54 | type MoveType = 'private-to-public' | 'public-to-private' | ||
55 | |||
56 | async function moveFiles (options: { | ||
57 | type: MoveType | ||
58 | video: MVideoFullLight | ||
59 | }) { | ||
60 | const { type, video } = options | ||
61 | |||
62 | for (const file of video.VideoFiles) { | ||
63 | if (file.storage === VideoStorage.FILE_SYSTEM) { | ||
64 | await moveWebTorrentFileOnFS(type, video, file) | ||
65 | } else { | ||
66 | await updateWebTorrentFileACL(video, file) | ||
67 | } | ||
68 | } | ||
69 | |||
70 | const hls = video.getHLSPlaylist() | ||
71 | |||
72 | if (hls) { | ||
73 | if (hls.storage === VideoStorage.FILE_SYSTEM) { | ||
74 | await moveHLSFilesOnFS(type, video) | ||
75 | } else { | ||
76 | await updateHLSFilesACL(hls) | ||
77 | } | ||
78 | } | ||
79 | } | ||
80 | |||
81 | async function moveWebTorrentFileOnFS (type: MoveType, video: MVideo, file: MVideoFile) { | ||
82 | const directories = getWebTorrentDirectories(type) | ||
83 | |||
84 | const source = join(directories.old, file.filename) | ||
85 | const destination = join(directories.new, file.filename) | ||
86 | |||
87 | try { | ||
88 | logger.info('Moving WebTorrent files of %s after privacy change (%s -> %s).', video.uuid, source, destination) | ||
89 | |||
90 | await move(source, destination) | ||
91 | } catch (err) { | ||
92 | logger.error('Cannot move webtorrent file %s to %s after privacy change', source, destination, { err }) | ||
93 | } | ||
94 | } | ||
95 | |||
96 | function getWebTorrentDirectories (moveType: MoveType) { | ||
97 | if (moveType === 'private-to-public') { | ||
98 | return { old: DIRECTORIES.VIDEOS.PRIVATE, new: DIRECTORIES.VIDEOS.PUBLIC } | ||
99 | } | ||
100 | |||
101 | return { old: DIRECTORIES.VIDEOS.PUBLIC, new: DIRECTORIES.VIDEOS.PRIVATE } | ||
102 | } | ||
103 | |||
104 | // --------------------------------------------------------------------------- | ||
105 | |||
106 | async function moveHLSFilesOnFS (type: MoveType, video: MVideo) { | ||
107 | const directories = getHLSDirectories(type) | ||
108 | |||
109 | const source = join(directories.old, video.uuid) | ||
110 | const destination = join(directories.new, video.uuid) | ||
111 | |||
112 | try { | ||
113 | logger.info('Moving HLS files of %s after privacy change (%s -> %s).', video.uuid, source, destination) | ||
114 | |||
115 | await move(source, destination) | ||
116 | } catch (err) { | ||
117 | logger.error('Cannot move HLS file %s to %s after privacy change', source, destination, { err }) | ||
118 | } | ||
119 | } | ||
120 | |||
121 | function getHLSDirectories (moveType: MoveType) { | ||
122 | if (moveType === 'private-to-public') { | ||
123 | return { old: DIRECTORIES.HLS_STREAMING_PLAYLIST.PRIVATE, new: DIRECTORIES.HLS_STREAMING_PLAYLIST.PUBLIC } | ||
124 | } | ||
125 | |||
126 | return { old: DIRECTORIES.HLS_STREAMING_PLAYLIST.PUBLIC, new: DIRECTORIES.HLS_STREAMING_PLAYLIST.PRIVATE } | ||
127 | } | ||