From 7dcd45a9a289c2da38eafd9a0b293453981b0da4 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Wed, 14 Dec 2022 14:06:12 +0100 Subject: Don't not autoplay live without autoplay setting --- client/src/standalone/videos/embed.ts | 29 ++++++++++------------ .../videos/shared/player-manager-options.ts | 6 ++--- support/doc/api/openapi.yaml | 6 +---- 3 files changed, 17 insertions(+), 24 deletions(-) diff --git a/client/src/standalone/videos/embed.ts b/client/src/standalone/videos/embed.ts index 5bb3b43c2..d268f4762 100644 --- a/client/src/standalone/videos/embed.ts +++ b/client/src/standalone/videos/embed.ts @@ -90,7 +90,7 @@ export class PeerTubeEmbed { if (!videoId) return - return this.loadVideoAndBuildPlayer({ uuid: videoId, forceAutoplay: false }) + return this.loadVideoAndBuildPlayer({ uuid: videoId, autoplayFromPreviousVideo: false, forceAutoplay: false }) } private async initPlaylist () { @@ -147,7 +147,7 @@ export class PeerTubeEmbed { this.playlistTracker.setCurrentElement(next) - return this.loadVideoAndBuildPlayer({ uuid: next.video.uuid, forceAutoplay: false }) + return this.loadVideoAndBuildPlayer({ uuid: next.video.uuid, autoplayFromPreviousVideo: true, forceAutoplay: false }) } async playPreviousPlaylistVideo () { @@ -159,7 +159,7 @@ export class PeerTubeEmbed { this.playlistTracker.setCurrentElement(previous) - await this.loadVideoAndBuildPlayer({ uuid: previous.video.uuid, forceAutoplay: false }) + await this.loadVideoAndBuildPlayer({ uuid: previous.video.uuid, autoplayFromPreviousVideo: true, forceAutoplay: false }) } getCurrentPlaylistPosition () { @@ -170,14 +170,15 @@ export class PeerTubeEmbed { private async loadVideoAndBuildPlayer (options: { uuid: string + autoplayFromPreviousVideo: boolean forceAutoplay: boolean }) { - const { uuid, forceAutoplay } = options + const { uuid, autoplayFromPreviousVideo, forceAutoplay } = options try { const { videoResponse, captionsPromise } = await this.videoFetcher.loadVideo(uuid) - return this.buildVideoPlayer({ videoResponse, captionsPromise, forceAutoplay }) + return this.buildVideoPlayer({ videoResponse, captionsPromise, autoplayFromPreviousVideo, forceAutoplay }) } catch (err) { this.playerHTML.displayError(err.message, await this.translationsPromise) } @@ -186,17 +187,18 @@ export class PeerTubeEmbed { private async buildVideoPlayer (options: { videoResponse: Response captionsPromise: Promise + autoplayFromPreviousVideo: boolean forceAutoplay: boolean }) { - const { videoResponse, captionsPromise, forceAutoplay } = options + const { videoResponse, captionsPromise, autoplayFromPreviousVideo, forceAutoplay } = options - const alreadyHadPlayer = this.resetPlayerElement() + this.resetPlayerElement() const videoInfoPromise = videoResponse.json() .then(async (videoInfo: VideoDetails) => { this.playerManagerOptions.loadParams(this.config, videoInfo) - if (!alreadyHadPlayer && !this.playerManagerOptions.hasAutoplay()) { + if (!autoplayFromPreviousVideo && !this.playerManagerOptions.hasAutoplay()) { this.playerHTML.buildPlaceholder(videoInfo) } const live = videoInfo.isLive @@ -224,14 +226,14 @@ export class PeerTubeEmbed { const playerOptions = await this.playerManagerOptions.getPlayerOptions({ video, captionsResponse, - alreadyHadPlayer, + autoplayFromPreviousVideo, translations, serverConfig: this.config, authorizationHeader: () => this.http.getHeaderTokenValue(), videoFileToken: () => videoFileToken, - onVideoUpdate: (uuid: string) => this.loadVideoAndBuildPlayer({ uuid, forceAutoplay: false }), + onVideoUpdate: (uuid: string) => this.loadVideoAndBuildPlayer({ uuid, autoplayFromPreviousVideo: true, forceAutoplay: false }), playlistTracker: this.playlistTracker, playNextPlaylistVideo: () => this.playNextPlaylistVideo(), @@ -277,7 +279,7 @@ export class PeerTubeEmbed { video, onPublishedVideo: () => { this.liveManager.stopListeningForChanges(video) - this.loadVideoAndBuildPlayer({ uuid: video.uuid, forceAutoplay: true }) + this.loadVideoAndBuildPlayer({ uuid: video.uuid, autoplayFromPreviousVideo: false, forceAutoplay: true }) } }) @@ -294,12 +296,9 @@ export class PeerTubeEmbed { } private resetPlayerElement () { - let alreadyHadPlayer = false - if (this.player) { this.player.dispose() this.player = undefined - alreadyHadPlayer = true } const playerElement = document.createElement('video') @@ -308,8 +307,6 @@ export class PeerTubeEmbed { this.playerHTML.setPlayerElement(playerElement) this.playerHTML.addPlayerElementToDOM() - - return alreadyHadPlayer } private async buildPlayerPlaylistUpnext () { diff --git a/client/src/standalone/videos/shared/player-manager-options.ts b/client/src/standalone/videos/shared/player-manager-options.ts index 9ec012369..b0bdb2dd9 100644 --- a/client/src/standalone/videos/shared/player-manager-options.ts +++ b/client/src/standalone/videos/shared/player-manager-options.ts @@ -162,7 +162,7 @@ export class PlayerManagerOptions { serverConfig: HTMLServerConfig - alreadyHadPlayer: boolean + autoplayFromPreviousVideo: boolean translations: Translations @@ -174,7 +174,7 @@ export class PlayerManagerOptions { const { video, captionsResponse, - alreadyHadPlayer, + autoplayFromPreviousVideo, videoFileToken, translations, forceAutoplay, @@ -189,7 +189,7 @@ export class PlayerManagerOptions { const playerOptions: PeertubePlayerManagerOptions = { common: { // Autoplay in playlist mode - autoplay: alreadyHadPlayer ? true : this.autoplay, + autoplay: autoplayFromPreviousVideo ? true : this.autoplay, forceAutoplay, controls: this.controls, diff --git a/support/doc/api/openapi.yaml b/support/doc/api/openapi.yaml index c2f9d424e..bfa7235a2 100644 --- a/support/doc/api/openapi.yaml +++ b/support/doc/api/openapi.yaml @@ -8128,17 +8128,13 @@ components: NotificationSettingValue: type: integer description: > - Notification type + Notification type. One of the following values, or a sum of multiple values: - `0` NONE - `1` WEB - `2` EMAIL - enum: - - 0 - - 1 - - 2 Notification: properties: id: -- cgit v1.2.3 From 28a398d6d7c178a54aeb5ff45c02daf64fec3e4e Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 15 Dec 2022 08:32:44 +0100 Subject: Clearer changelog --- CHANGELOG.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 182beb67b..36506e20e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,11 +16,11 @@ * Classic installation: `cd /var/www/peertube/peertube-latest && sudo -u peertube NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production node dist/scripts/migrations/peertube-5.0.js` * Docker installation: `cd /var/www/peertube-docker && docker-compose exec -u peertube peertube node dist/scripts/migrations/peertube-5.0.js` * Configuration changes (`config/production.yaml`): - * There is a new `secrets.peertube` configuration. You must fill it before running PeerTube v5 - * `object_storage.upload_acl` is now a parent key that you must update + * There is a new `secrets.peertube` configuration. You must fill it before running PeerTube v5: https://github.com/Chocobozzz/PeerTube/blob/v5.0.0/config/production.yaml.example#L14 + * `object_storage.upload_acl` is now a parent key that you must update: https://github.com/Chocobozzz/PeerTube/blob/v5.0.0/config/production.yaml.example#L153 * You must update your nginx configuration: - * We introduced a new `location` for plugin websocket routes - * We introduced a new `location` for private videos files + * We introduced a new `location` for plugin websocket routes: https://github.com/Chocobozzz/PeerTube/blob/v5.0.0/support/nginx/peertube#L135 + * We introduced a new `location` for private videos files: https://github.com/Chocobozzz/PeerTube/blob/v5.0.0/support/nginx/peertube#L217 ### Documentation -- cgit v1.2.3 From 57e11a20f12c69927e5739ecf541ed340934ff90 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 19 Dec 2022 16:06:58 +0100 Subject: Forward 206 status code for object storage proxy --- server/controllers/object-storage-proxy.ts | 15 +++++++++++++-- .../lib/object-storage/shared/object-storage-helpers.ts | 5 ++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/server/controllers/object-storage-proxy.ts b/server/controllers/object-storage-proxy.ts index aa853a383..32b8d21da 100644 --- a/server/controllers/object-storage-proxy.ts +++ b/server/controllers/object-storage-proxy.ts @@ -15,6 +15,7 @@ import { } from '@server/middlewares' import { HttpStatusCode } from '@shared/models' import { buildReinjectVideoFileTokenQuery, doReinjectVideoFileToken } from './shared/m3u8-playlist' +import { GetObjectCommandOutput } from '@aws-sdk/client-s3' const objectStorageProxyRouter = express.Router() @@ -46,11 +47,13 @@ async function proxifyWebTorrent (req: express.Request, res: express.Response) { logger.debug('Proxifying WebTorrent file %s from object storage.', filename) try { - const stream = await getWebTorrentFileReadStream({ + const { response: s3Response, stream } = await getWebTorrentFileReadStream({ filename, rangeHeader: req.header('range') }) + setS3Headers(res, s3Response) + return stream.pipe(res) } catch (err) { return handleObjectStorageFailure(res, err) @@ -65,12 +68,14 @@ async function proxifyHLS (req: express.Request, res: express.Response) { logger.debug('Proxifying HLS file %s from object storage.', filename) try { - const stream = await getHLSFileReadStream({ + const { response: s3Response, stream } = await getHLSFileReadStream({ playlist: playlist.withVideo(video), filename, rangeHeader: req.header('range') }) + setS3Headers(res, s3Response) + const streamReplacer = filename.endsWith('.m3u8') && doReinjectVideoFileToken(req) ? new StreamReplacer(line => injectQueryToPlaylistUrls(line, buildReinjectVideoFileTokenQuery(req))) : new PassThrough() @@ -102,3 +107,9 @@ function handleObjectStorageFailure (res: express.Response, err: Error) { type: err.name }) } + +function setS3Headers (res: express.Response, s3Response: GetObjectCommandOutput) { + if (s3Response.$metadata.httpStatusCode === HttpStatusCode.PARTIAL_CONTENT_206) { + res.status(HttpStatusCode.PARTIAL_CONTENT_206) + } +} diff --git a/server/lib/object-storage/shared/object-storage-helpers.ts b/server/lib/object-storage/shared/object-storage-helpers.ts index 3046d76bc..8dff08ab4 100644 --- a/server/lib/object-storage/shared/object-storage-helpers.ts +++ b/server/lib/object-storage/shared/object-storage-helpers.ts @@ -187,7 +187,10 @@ async function createObjectReadStream (options: { const response = await getClient().send(command) - return response.Body as Readable + return { + response, + stream: response.Body as Readable + } } // --------------------------------------------------------------------------- -- cgit v1.2.3