diff options
Diffstat (limited to 'server/helpers')
-rw-r--r-- | server/helpers/database-utils.ts | 31 | ||||
-rw-r--r-- | server/helpers/ffmpeg-utils.ts | 15 | ||||
-rw-r--r-- | server/helpers/webtorrent.ts | 5 |
3 files changed, 38 insertions, 13 deletions
diff --git a/server/helpers/database-utils.ts b/server/helpers/database-utils.ts index cbd7aa401..422774022 100644 --- a/server/helpers/database-utils.ts +++ b/server/helpers/database-utils.ts | |||
@@ -1,6 +1,6 @@ | |||
1 | import * as retry from 'async/retry' | 1 | import * as retry from 'async/retry' |
2 | import * as Bluebird from 'bluebird' | 2 | import * as Bluebird from 'bluebird' |
3 | import { QueryTypes, Transaction } from 'sequelize' | 3 | import { BindOrReplacements, QueryTypes, Transaction } from 'sequelize' |
4 | import { Model } from 'sequelize-typescript' | 4 | import { Model } from 'sequelize-typescript' |
5 | import { sequelizeTypescript } from '@server/initializers/database' | 5 | import { sequelizeTypescript } from '@server/initializers/database' |
6 | import { logger } from './logger' | 6 | import { logger } from './logger' |
@@ -84,13 +84,15 @@ function resetSequelizeInstance (instance: Model<any>, savedFields: object) { | |||
84 | }) | 84 | }) |
85 | } | 85 | } |
86 | 86 | ||
87 | function deleteNonExistingModels <T extends { hasSameUniqueKeysThan (other: T): boolean } & Pick<Model, 'destroy'>> ( | 87 | function filterNonExistingModels <T extends { hasSameUniqueKeysThan (other: T): boolean }> ( |
88 | fromDatabase: T[], | 88 | fromDatabase: T[], |
89 | newModels: T[], | 89 | newModels: T[] |
90 | t: Transaction | ||
91 | ) { | 90 | ) { |
92 | return fromDatabase.filter(f => !newModels.find(newModel => newModel.hasSameUniqueKeysThan(f))) | 91 | return fromDatabase.filter(f => !newModels.find(newModel => newModel.hasSameUniqueKeysThan(f))) |
93 | .map(f => f.destroy({ transaction: t })) | 92 | } |
93 | |||
94 | function deleteAllModels <T extends Pick<Model, 'destroy'>> (models: T[], transaction: Transaction) { | ||
95 | return Promise.all(models.map(f => f.destroy({ transaction }))) | ||
94 | } | 96 | } |
95 | 97 | ||
96 | // Sequelize always skip the update if we only update updatedAt field | 98 | // Sequelize always skip the update if we only update updatedAt field |
@@ -121,13 +123,28 @@ function afterCommitIfTransaction (t: Transaction, fn: Function) { | |||
121 | 123 | ||
122 | // --------------------------------------------------------------------------- | 124 | // --------------------------------------------------------------------------- |
123 | 125 | ||
126 | function doesExist (query: string, bind?: BindOrReplacements) { | ||
127 | const options = { | ||
128 | type: QueryTypes.SELECT as QueryTypes.SELECT, | ||
129 | bind, | ||
130 | raw: true | ||
131 | } | ||
132 | |||
133 | return sequelizeTypescript.query(query, options) | ||
134 | .then(results => results.length === 1) | ||
135 | } | ||
136 | |||
137 | // --------------------------------------------------------------------------- | ||
138 | |||
124 | export { | 139 | export { |
125 | resetSequelizeInstance, | 140 | resetSequelizeInstance, |
126 | retryTransactionWrapper, | 141 | retryTransactionWrapper, |
127 | transactionRetryer, | 142 | transactionRetryer, |
128 | updateInstanceWithAnother, | 143 | updateInstanceWithAnother, |
129 | afterCommitIfTransaction, | 144 | afterCommitIfTransaction, |
130 | deleteNonExistingModels, | 145 | filterNonExistingModels, |
146 | deleteAllModels, | ||
131 | setAsUpdated, | 147 | setAsUpdated, |
132 | runInReadCommittedTransaction | 148 | runInReadCommittedTransaction, |
149 | doesExist | ||
133 | } | 150 | } |
diff --git a/server/helpers/ffmpeg-utils.ts b/server/helpers/ffmpeg-utils.ts index 6f5a71b4a..9ad4b7f3b 100644 --- a/server/helpers/ffmpeg-utils.ts +++ b/server/helpers/ffmpeg-utils.ts | |||
@@ -212,14 +212,17 @@ async function transcode (options: TranscodeOptions) { | |||
212 | 212 | ||
213 | async function getLiveTranscodingCommand (options: { | 213 | async function getLiveTranscodingCommand (options: { |
214 | rtmpUrl: string | 214 | rtmpUrl: string |
215 | |||
215 | outPath: string | 216 | outPath: string |
217 | masterPlaylistName: string | ||
218 | |||
216 | resolutions: number[] | 219 | resolutions: number[] |
217 | fps: number | 220 | fps: number |
218 | 221 | ||
219 | availableEncoders: AvailableEncoders | 222 | availableEncoders: AvailableEncoders |
220 | profile: string | 223 | profile: string |
221 | }) { | 224 | }) { |
222 | const { rtmpUrl, outPath, resolutions, fps, availableEncoders, profile } = options | 225 | const { rtmpUrl, outPath, resolutions, fps, availableEncoders, profile, masterPlaylistName } = options |
223 | const input = rtmpUrl | 226 | const input = rtmpUrl |
224 | 227 | ||
225 | const command = getFFmpeg(input, 'live') | 228 | const command = getFFmpeg(input, 'live') |
@@ -301,14 +304,14 @@ async function getLiveTranscodingCommand (options: { | |||
301 | 304 | ||
302 | command.complexFilter(complexFilter) | 305 | command.complexFilter(complexFilter) |
303 | 306 | ||
304 | addDefaultLiveHLSParams(command, outPath) | 307 | addDefaultLiveHLSParams(command, outPath, masterPlaylistName) |
305 | 308 | ||
306 | command.outputOption('-var_stream_map', varStreamMap.join(' ')) | 309 | command.outputOption('-var_stream_map', varStreamMap.join(' ')) |
307 | 310 | ||
308 | return command | 311 | return command |
309 | } | 312 | } |
310 | 313 | ||
311 | function getLiveMuxingCommand (rtmpUrl: string, outPath: string) { | 314 | function getLiveMuxingCommand (rtmpUrl: string, outPath: string, masterPlaylistName: string) { |
312 | const command = getFFmpeg(rtmpUrl, 'live') | 315 | const command = getFFmpeg(rtmpUrl, 'live') |
313 | 316 | ||
314 | command.outputOption('-c:v copy') | 317 | command.outputOption('-c:v copy') |
@@ -316,7 +319,7 @@ function getLiveMuxingCommand (rtmpUrl: string, outPath: string) { | |||
316 | command.outputOption('-map 0:a?') | 319 | command.outputOption('-map 0:a?') |
317 | command.outputOption('-map 0:v?') | 320 | command.outputOption('-map 0:v?') |
318 | 321 | ||
319 | addDefaultLiveHLSParams(command, outPath) | 322 | addDefaultLiveHLSParams(command, outPath, masterPlaylistName) |
320 | 323 | ||
321 | return command | 324 | return command |
322 | } | 325 | } |
@@ -371,12 +374,12 @@ function addDefaultEncoderParams (options: { | |||
371 | } | 374 | } |
372 | } | 375 | } |
373 | 376 | ||
374 | function addDefaultLiveHLSParams (command: ffmpeg.FfmpegCommand, outPath: string) { | 377 | function addDefaultLiveHLSParams (command: ffmpeg.FfmpegCommand, outPath: string, masterPlaylistName: string) { |
375 | command.outputOption('-hls_time ' + VIDEO_LIVE.SEGMENT_TIME_SECONDS) | 378 | command.outputOption('-hls_time ' + VIDEO_LIVE.SEGMENT_TIME_SECONDS) |
376 | command.outputOption('-hls_list_size ' + VIDEO_LIVE.SEGMENTS_LIST_SIZE) | 379 | command.outputOption('-hls_list_size ' + VIDEO_LIVE.SEGMENTS_LIST_SIZE) |
377 | command.outputOption('-hls_flags delete_segments+independent_segments') | 380 | command.outputOption('-hls_flags delete_segments+independent_segments') |
378 | command.outputOption(`-hls_segment_filename ${join(outPath, '%v-%06d.ts')}`) | 381 | command.outputOption(`-hls_segment_filename ${join(outPath, '%v-%06d.ts')}`) |
379 | command.outputOption('-master_pl_name master.m3u8') | 382 | command.outputOption('-master_pl_name ' + masterPlaylistName) |
380 | command.outputOption(`-f hls`) | 383 | command.outputOption(`-f hls`) |
381 | 384 | ||
382 | command.output(join(outPath, '%v.m3u8')) | 385 | command.output(join(outPath, '%v.m3u8')) |
diff --git a/server/helpers/webtorrent.ts b/server/helpers/webtorrent.ts index d8220ba9c..ecf63e93e 100644 --- a/server/helpers/webtorrent.ts +++ b/server/helpers/webtorrent.ts | |||
@@ -103,6 +103,11 @@ async function createTorrentAndSetInfoHash ( | |||
103 | 103 | ||
104 | await writeFile(torrentPath, torrent) | 104 | await writeFile(torrentPath, torrent) |
105 | 105 | ||
106 | // Remove old torrent file if it existed | ||
107 | if (videoFile.hasTorrent()) { | ||
108 | await remove(join(CONFIG.STORAGE.TORRENTS_DIR, videoFile.torrentFilename)) | ||
109 | } | ||
110 | |||
106 | const parsedTorrent = parseTorrent(torrent) | 111 | const parsedTorrent = parseTorrent(torrent) |
107 | videoFile.infoHash = parsedTorrent.infoHash | 112 | videoFile.infoHash = parsedTorrent.infoHash |
108 | videoFile.torrentFilename = torrentFilename | 113 | videoFile.torrentFilename = torrentFilename |