diff options
-rw-r--r-- | server/lib/live/live-manager.ts | 4 | ||||
-rw-r--r-- | server/lib/object-storage/urls.ts | 2 | ||||
-rw-r--r-- | server/tests/api/object-storage/live.ts | 62 | ||||
-rw-r--r-- | server/tests/api/object-storage/videos.ts | 12 | ||||
-rw-r--r-- | server/tests/shared/live.ts | 23 | ||||
-rw-r--r-- | server/tests/shared/mock-servers/mock-object-storage.ts | 2 | ||||
-rw-r--r-- | shared/server-commands/videos/live-command.ts | 12 |
7 files changed, 99 insertions, 18 deletions
diff --git a/server/lib/live/live-manager.ts b/server/lib/live/live-manager.ts index 9ea983119..fa4e1df07 100644 --- a/server/lib/live/live-manager.ts +++ b/server/lib/live/live-manager.ts | |||
@@ -487,7 +487,9 @@ class LiveManager { | |||
487 | ? VideoStorage.OBJECT_STORAGE | 487 | ? VideoStorage.OBJECT_STORAGE |
488 | : VideoStorage.FILE_SYSTEM | 488 | : VideoStorage.FILE_SYSTEM |
489 | 489 | ||
490 | playlist.assignP2PMediaLoaderInfoHashes(video, allResolutions) | 490 | if (playlist.storage === VideoStorage.FILE_SYSTEM) { |
491 | playlist.assignP2PMediaLoaderInfoHashes(video, allResolutions) | ||
492 | } | ||
491 | 493 | ||
492 | return playlist.save() | 494 | return playlist.save() |
493 | } | 495 | } |
diff --git a/server/lib/object-storage/urls.ts b/server/lib/object-storage/urls.ts index a47a98b98..b8ef94559 100644 --- a/server/lib/object-storage/urls.ts +++ b/server/lib/object-storage/urls.ts | |||
@@ -57,5 +57,7 @@ function getBaseUrl (bucketInfo: BucketInfo, baseUrl?: string) { | |||
57 | 57 | ||
58 | const regex = new RegExp('https?://[^/]+') | 58 | const regex = new RegExp('https?://[^/]+') |
59 | function replaceByBaseUrl (fileUrl: string, baseUrl: string) { | 59 | function replaceByBaseUrl (fileUrl: string, baseUrl: string) { |
60 | if (!fileUrl) return fileUrl | ||
61 | |||
60 | return fileUrl.replace(regex, baseUrl) | 62 | return fileUrl.replace(regex, baseUrl) |
61 | } | 63 | } |
diff --git a/server/tests/api/object-storage/live.ts b/server/tests/api/object-storage/live.ts index ad2b554b7..2a3fc4779 100644 --- a/server/tests/api/object-storage/live.ts +++ b/server/tests/api/object-storage/live.ts | |||
@@ -1,7 +1,7 @@ | |||
1 | /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ | 1 | /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ |
2 | 2 | ||
3 | import { expect } from 'chai' | 3 | import { expect } from 'chai' |
4 | import { expectStartWith, testVideoResolutions } from '@server/tests/shared' | 4 | import { expectStartWith, MockObjectStorageProxy, testVideoResolutions } from '@server/tests/shared' |
5 | import { areMockObjectStorageTestsDisabled } from '@shared/core-utils' | 5 | import { areMockObjectStorageTestsDisabled } from '@shared/core-utils' |
6 | import { HttpStatusCode, LiveVideoCreate, VideoPrivacy } from '@shared/models' | 6 | import { HttpStatusCode, LiveVideoCreate, VideoPrivacy } from '@shared/models' |
7 | import { | 7 | import { |
@@ -93,7 +93,7 @@ describe('Object storage for lives', function () { | |||
93 | await servers[0].config.enableTranscoding() | 93 | await servers[0].config.enableTranscoding() |
94 | }) | 94 | }) |
95 | 95 | ||
96 | describe('Without live transcoding', async function () { | 96 | describe('Without live transcoding', function () { |
97 | let videoUUID: string | 97 | let videoUUID: string |
98 | 98 | ||
99 | before(async function () { | 99 | before(async function () { |
@@ -134,7 +134,7 @@ describe('Object storage for lives', function () { | |||
134 | }) | 134 | }) |
135 | }) | 135 | }) |
136 | 136 | ||
137 | describe('With live transcoding', async function () { | 137 | describe('With live transcoding', function () { |
138 | const resolutions = [ 720, 480, 360, 240, 144 ] | 138 | const resolutions = [ 720, 480, 360, 240, 144 ] |
139 | 139 | ||
140 | before(async function () { | 140 | before(async function () { |
@@ -223,6 +223,62 @@ describe('Object storage for lives', function () { | |||
223 | }) | 223 | }) |
224 | }) | 224 | }) |
225 | 225 | ||
226 | describe('With object storage base url', function () { | ||
227 | const mockObjectStorageProxy = new MockObjectStorageProxy() | ||
228 | let baseMockUrl: string | ||
229 | |||
230 | before(async function () { | ||
231 | this.timeout(120000) | ||
232 | |||
233 | const port = await mockObjectStorageProxy.initialize() | ||
234 | baseMockUrl = `http://127.0.0.1:${port}/streaming-playlists` | ||
235 | |||
236 | await ObjectStorageCommand.createMockBucket('streaming-playlists') | ||
237 | |||
238 | const config = { | ||
239 | object_storage: { | ||
240 | enabled: true, | ||
241 | endpoint: 'http://' + ObjectStorageCommand.getMockEndpointHost(), | ||
242 | region: ObjectStorageCommand.getMockRegion(), | ||
243 | |||
244 | credentials: ObjectStorageCommand.getMockCredentialsConfig(), | ||
245 | |||
246 | streaming_playlists: { | ||
247 | bucket_name: 'streaming-playlists', | ||
248 | prefix: '', | ||
249 | base_url: baseMockUrl | ||
250 | } | ||
251 | } | ||
252 | } | ||
253 | |||
254 | await servers[0].kill() | ||
255 | await servers[0].run(config) | ||
256 | |||
257 | await servers[0].config.enableLive({ transcoding: true, resolutions: 'min' }) | ||
258 | }) | ||
259 | |||
260 | it('Should publish a live and replace the base url', async function () { | ||
261 | this.timeout(240000) | ||
262 | |||
263 | const videoUUIDPermanent = await createLive(servers[0], true) | ||
264 | |||
265 | const ffmpegCommand = await servers[0].live.sendRTMPStreamInVideo({ videoId: videoUUIDPermanent }) | ||
266 | await waitUntilLivePublishedOnAllServers(servers, videoUUIDPermanent) | ||
267 | |||
268 | await testVideoResolutions({ | ||
269 | originServer: servers[0], | ||
270 | servers, | ||
271 | liveVideoId: videoUUIDPermanent, | ||
272 | resolutions: [ 720 ], | ||
273 | transcoded: true, | ||
274 | objectStorage: true, | ||
275 | objectStorageBaseUrl: baseMockUrl | ||
276 | }) | ||
277 | |||
278 | await stopFfmpeg(ffmpegCommand) | ||
279 | }) | ||
280 | }) | ||
281 | |||
226 | after(async function () { | 282 | after(async function () { |
227 | await killallServers(servers) | 283 | await killallServers(servers) |
228 | }) | 284 | }) |
diff --git a/server/tests/api/object-storage/videos.ts b/server/tests/api/object-storage/videos.ts index 1b3c389d7..6862658cc 100644 --- a/server/tests/api/object-storage/videos.ts +++ b/server/tests/api/object-storage/videos.ts | |||
@@ -9,7 +9,7 @@ import { | |||
9 | expectLogDoesNotContain, | 9 | expectLogDoesNotContain, |
10 | expectStartWith, | 10 | expectStartWith, |
11 | generateHighBitrateVideo, | 11 | generateHighBitrateVideo, |
12 | MockObjectStorage | 12 | MockObjectStorageProxy |
13 | } from '@server/tests/shared' | 13 | } from '@server/tests/shared' |
14 | import { areMockObjectStorageTestsDisabled } from '@shared/core-utils' | 14 | import { areMockObjectStorageTestsDisabled } from '@shared/core-utils' |
15 | import { HttpStatusCode, VideoDetails } from '@shared/models' | 15 | import { HttpStatusCode, VideoDetails } from '@shared/models' |
@@ -124,7 +124,7 @@ function runTestSuite (options: { | |||
124 | 124 | ||
125 | useMockBaseUrl?: boolean | 125 | useMockBaseUrl?: boolean |
126 | }) { | 126 | }) { |
127 | const mockObjectStorage = new MockObjectStorage() | 127 | const mockObjectStorageProxy = new MockObjectStorageProxy() |
128 | const { fixture } = options | 128 | const { fixture } = options |
129 | let baseMockUrl: string | 129 | let baseMockUrl: string |
130 | 130 | ||
@@ -138,8 +138,10 @@ function runTestSuite (options: { | |||
138 | before(async function () { | 138 | before(async function () { |
139 | this.timeout(120000) | 139 | this.timeout(120000) |
140 | 140 | ||
141 | const port = await mockObjectStorage.initialize() | 141 | const port = await mockObjectStorageProxy.initialize() |
142 | baseMockUrl = options.useMockBaseUrl ? `http://127.0.0.1:${port}` : undefined | 142 | baseMockUrl = options.useMockBaseUrl |
143 | ? `http://127.0.0.1:${port}` | ||
144 | : undefined | ||
143 | 145 | ||
144 | await ObjectStorageCommand.createMockBucket(options.playlistBucket) | 146 | await ObjectStorageCommand.createMockBucket(options.playlistBucket) |
145 | await ObjectStorageCommand.createMockBucket(options.webtorrentBucket) | 147 | await ObjectStorageCommand.createMockBucket(options.webtorrentBucket) |
@@ -254,7 +256,7 @@ function runTestSuite (options: { | |||
254 | }) | 256 | }) |
255 | 257 | ||
256 | after(async function () { | 258 | after(async function () { |
257 | await mockObjectStorage.terminate() | 259 | await mockObjectStorageProxy.terminate() |
258 | 260 | ||
259 | await cleanupTests(servers) | 261 | await cleanupTests(servers) |
260 | }) | 262 | }) |
diff --git a/server/tests/shared/live.ts b/server/tests/shared/live.ts index 1c868eb5b..ff0b2f226 100644 --- a/server/tests/shared/live.ts +++ b/server/tests/shared/live.ts | |||
@@ -3,10 +3,10 @@ | |||
3 | import { expect } from 'chai' | 3 | import { expect } from 'chai' |
4 | import { pathExists, readdir } from 'fs-extra' | 4 | import { pathExists, readdir } from 'fs-extra' |
5 | import { join } from 'path' | 5 | import { join } from 'path' |
6 | import { sha1 } from '@shared/extra-utils' | ||
6 | import { LiveVideo, VideoStreamingPlaylistType } from '@shared/models' | 7 | import { LiveVideo, VideoStreamingPlaylistType } from '@shared/models' |
7 | import { ObjectStorageCommand, PeerTubeServer } from '@shared/server-commands' | 8 | import { ObjectStorageCommand, PeerTubeServer } from '@shared/server-commands' |
8 | import { checkLiveSegmentHash, checkResolutionsInMasterPlaylist } from './streaming-playlists' | 9 | import { checkLiveSegmentHash, checkResolutionsInMasterPlaylist } from './streaming-playlists' |
9 | import { sha1 } from '@shared/extra-utils' | ||
10 | 10 | ||
11 | async function checkLiveCleanup (options: { | 11 | async function checkLiveCleanup (options: { |
12 | server: PeerTubeServer | 12 | server: PeerTubeServer |
@@ -42,9 +42,19 @@ async function testVideoResolutions (options: { | |||
42 | liveVideoId: string | 42 | liveVideoId: string |
43 | resolutions: number[] | 43 | resolutions: number[] |
44 | transcoded: boolean | 44 | transcoded: boolean |
45 | |||
45 | objectStorage: boolean | 46 | objectStorage: boolean |
47 | objectStorageBaseUrl?: string | ||
46 | }) { | 48 | }) { |
47 | const { originServer, servers, liveVideoId, resolutions, transcoded, objectStorage } = options | 49 | const { |
50 | originServer, | ||
51 | servers, | ||
52 | liveVideoId, | ||
53 | resolutions, | ||
54 | transcoded, | ||
55 | objectStorage, | ||
56 | objectStorageBaseUrl = ObjectStorageCommand.getMockPlaylistBaseUrl() | ||
57 | } = options | ||
48 | 58 | ||
49 | for (const server of servers) { | 59 | for (const server of servers) { |
50 | const { data } = await server.videos.list() | 60 | const { data } = await server.videos.list() |
@@ -66,7 +76,7 @@ async function testVideoResolutions (options: { | |||
66 | }) | 76 | }) |
67 | 77 | ||
68 | if (objectStorage) { | 78 | if (objectStorage) { |
69 | expect(hlsPlaylist.playlistUrl).to.contain(ObjectStorageCommand.getMockPlaylistBaseUrl()) | 79 | expect(hlsPlaylist.playlistUrl).to.contain(objectStorageBaseUrl) |
70 | } | 80 | } |
71 | 81 | ||
72 | for (let i = 0; i < resolutions.length; i++) { | 82 | for (let i = 0; i < resolutions.length; i++) { |
@@ -77,15 +87,16 @@ async function testVideoResolutions (options: { | |||
77 | videoUUID: video.uuid, | 87 | videoUUID: video.uuid, |
78 | playlistNumber: i, | 88 | playlistNumber: i, |
79 | segment: segmentNum, | 89 | segment: segmentNum, |
80 | objectStorage | 90 | objectStorage, |
91 | objectStorageBaseUrl | ||
81 | }) | 92 | }) |
82 | 93 | ||
83 | const baseUrl = objectStorage | 94 | const baseUrl = objectStorage |
84 | ? ObjectStorageCommand.getMockPlaylistBaseUrl() + 'hls' | 95 | ? join(objectStorageBaseUrl, 'hls') |
85 | : originServer.url + '/static/streaming-playlists/hls' | 96 | : originServer.url + '/static/streaming-playlists/hls' |
86 | 97 | ||
87 | if (objectStorage) { | 98 | if (objectStorage) { |
88 | expect(hlsPlaylist.segmentsSha256Url).to.contain(ObjectStorageCommand.getMockPlaylistBaseUrl()) | 99 | expect(hlsPlaylist.segmentsSha256Url).to.contain(objectStorageBaseUrl) |
89 | } | 100 | } |
90 | 101 | ||
91 | const subPlaylist = await originServer.streamingPlaylists.get({ | 102 | const subPlaylist = await originServer.streamingPlaylists.get({ |
diff --git a/server/tests/shared/mock-servers/mock-object-storage.ts b/server/tests/shared/mock-servers/mock-object-storage.ts index 8c325bf11..ae76c4f3f 100644 --- a/server/tests/shared/mock-servers/mock-object-storage.ts +++ b/server/tests/shared/mock-servers/mock-object-storage.ts | |||
@@ -5,7 +5,7 @@ import { pipeline } from 'stream' | |||
5 | import { ObjectStorageCommand } from '@shared/server-commands' | 5 | import { ObjectStorageCommand } from '@shared/server-commands' |
6 | import { getPort, randomListen, terminateServer } from './shared' | 6 | import { getPort, randomListen, terminateServer } from './shared' |
7 | 7 | ||
8 | export class MockObjectStorage { | 8 | export class MockObjectStorageProxy { |
9 | private server: Server | 9 | private server: Server |
10 | 10 | ||
11 | async initialize () { | 11 | async initialize () { |
diff --git a/shared/server-commands/videos/live-command.ts b/shared/server-commands/videos/live-command.ts index cc9502c6f..4541465ba 100644 --- a/shared/server-commands/videos/live-command.ts +++ b/shared/server-commands/videos/live-command.ts | |||
@@ -192,12 +192,20 @@ export class LiveCommand extends AbstractCommand { | |||
192 | playlistNumber: number | 192 | playlistNumber: number |
193 | segment: number | 193 | segment: number |
194 | objectStorage: boolean | 194 | objectStorage: boolean |
195 | objectStorageBaseUrl?: string | ||
195 | }) { | 196 | }) { |
196 | const { server, objectStorage, playlistNumber, segment, videoUUID } = options | 197 | const { |
198 | server, | ||
199 | objectStorage, | ||
200 | playlistNumber, | ||
201 | segment, | ||
202 | videoUUID, | ||
203 | objectStorageBaseUrl = ObjectStorageCommand.getMockPlaylistBaseUrl() | ||
204 | } = options | ||
197 | 205 | ||
198 | const segmentName = `${playlistNumber}-00000${segment}.ts` | 206 | const segmentName = `${playlistNumber}-00000${segment}.ts` |
199 | const baseUrl = objectStorage | 207 | const baseUrl = objectStorage |
200 | ? ObjectStorageCommand.getMockPlaylistBaseUrl() + 'hls' | 208 | ? join(objectStorageBaseUrl, 'hls') |
201 | : server.url + '/static/streaming-playlists/hls' | 209 | : server.url + '/static/streaming-playlists/hls' |
202 | 210 | ||
203 | let error = true | 211 | let error = true |