diff --git a/CHANGELOG.md b/CHANGELOG.md index fe0d4c340..34beb49e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## v6.3.3 + +### Bug fixes + + * Fix broken thumbnails on live replay + * Fix detecting portrait rotation of some video + * Don't allow to select a frame from a live to set the thumbnail + * Fix lost video stream with specific transcoding settings and video input + * Fix creating playlist without thumbnail when using the REST API + * Fix `.mov` video upload on some Windows versions + * Fix `video-plugin-metadata.result` client plugin hook + + ## v6.3.2 ### Bug fixes diff --git a/client/package.json b/client/package.json index f0a0d9099..8c7864351 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "peertube-client", - "version": "6.3.2", + "version": "6.3.3", "private": true, "license": "AGPL-3.0", "author": { diff --git a/package.json b/package.json index 9dddcc7f2..f9b20725e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "peertube", "description": "PeerTube, an ActivityPub-federated video streaming platform using P2P directly in your web browser.", - "version": "6.3.2", + "version": "6.3.3", "private": true, "licence": "AGPL-3.0", "engines": { diff --git a/packages/tests/src/api/transcoding/transcoder-limits.ts b/packages/tests/src/api/transcoding/transcoder-limits.ts index 8189b8673..8e786b6b1 100644 --- a/packages/tests/src/api/transcoding/transcoder-limits.ts +++ b/packages/tests/src/api/transcoding/transcoder-limits.ts @@ -290,6 +290,23 @@ describe('Test video transcoding limits', function () { expect(video.files[0].resolution.id).to.equal(720) expect(hlsFiles[0].resolution.id).to.equal(720) }) + + it('Should keep input resolution if only upper resolutions are enabled', async function () { + this.timeout(120_000) + + await servers[0].config.enableTranscoding({ resolutions: [ 0, 1080 ], keepOriginal: false }) + + const { uuid } = await servers[0].videos.quickUpload({ name: 'video', fixture: 'video_short.webm' }) + await waitJobs(servers) + + const video = await servers[0].videos.get({ id: uuid }) + const hlsFiles = video.streamingPlaylists[0].files + + expect(video.files).to.have.lengthOf(2) + expect(hlsFiles).to.have.lengthOf(2) + + expect(getAllFiles(video).map(f => f.resolution.id)).to.have.members([ 720, 720, 0, 0 ]) + }) }) after(async function () { diff --git a/server/core/controllers/api/video-playlist.ts b/server/core/controllers/api/video-playlist.ts index 8283c59b2..ed652a426 100644 --- a/server/core/controllers/api/video-playlist.ts +++ b/server/core/controllers/api/video-playlist.ts @@ -179,7 +179,7 @@ async function createVideoPlaylist (req: express.Request, res: express.Response) videoPlaylist.VideoChannel = videoChannel } - const thumbnailField = req.files['thumbnailfile'] + const thumbnailField = req.files?.['thumbnailfile'] const thumbnailModel = thumbnailField ? await updateLocalPlaylistMiniatureFromExisting({ inputPath: thumbnailField[0].path, @@ -220,7 +220,7 @@ async function updateVideoPlaylist (req: express.Request, res: express.Response) const wasPrivatePlaylist = videoPlaylistInstance.privacy === VideoPlaylistPrivacy.PRIVATE const wasNotPrivatePlaylist = videoPlaylistInstance.privacy !== VideoPlaylistPrivacy.PRIVATE - const thumbnailField = req.files['thumbnailfile'] + const thumbnailField = req.files?.['thumbnailfile'] const thumbnailModel = thumbnailField ? await updateLocalPlaylistMiniatureFromExisting({ inputPath: thumbnailField[0].path, diff --git a/server/core/lib/transcoding/transcoding-resolutions.ts b/server/core/lib/transcoding/transcoding-resolutions.ts index b1c55edf9..93c58491e 100644 --- a/server/core/lib/transcoding/transcoding-resolutions.ts +++ b/server/core/lib/transcoding/transcoding-resolutions.ts @@ -16,7 +16,10 @@ export function buildOriginalFileResolution (inputResolution: number) { hasAudio: true }) - if (resolutions.length === 0) { + if ( + resolutions.length === 0 || + (resolutions.length === 1 && resolutions[0] === VideoResolution.H_NOVIDEO) + ) { return toEven(inputResolution) } @@ -58,7 +61,7 @@ export function computeResolutionsToTranscode (options: { if (input < resolution) continue // We only want lower resolutions than input file if (strictLower && input === resolution) continue - // Audio resolutio but no audio in the video + // Audio resolution but no audio in the video if (resolution === VideoResolution.H_NOVIDEO && !hasAudio) continue resolutionsEnabled.add(resolution)