diff --git a/CHANGELOG.md b/CHANGELOG.md index 64d3c9bdb..9f057c152 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ ## v4.3.0 +### IMPORTANT NOTES + + * Redis **<** 5.x is not supported anymore + * FFmpeg **<** 4.3 is not supported anymore + ### Maintenance * Use `yt-dlp` by default instead of `youtube-dl` for new installations (because of much more dev activity) diff --git a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.scss b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.scss index 1bc9aebba..dda5d0b5e 100644 --- a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.scss +++ b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.scss @@ -36,6 +36,10 @@ input[type=number] { position: absolute; top: 0.2em; right: 2.5rem; + + @media screen and (max-width: $mobile-view) { + display: none; + } } input[disabled] { diff --git a/client/src/app/shared/shared-main/buttons/action-dropdown.component.html b/client/src/app/shared/shared-main/buttons/action-dropdown.component.html index 017355bd0..37cf63fcd 100644 --- a/client/src/app/shared/shared-main/buttons/action-dropdown.component.html +++ b/client/src/app/shared/shared-main/buttons/action-dropdown.component.html @@ -18,7 +18,7 @@ -
+
{{ action.label }} {{ action.description }}
diff --git a/client/src/app/shared/shared-main/buttons/action-dropdown.component.scss b/client/src/app/shared/shared-main/buttons/action-dropdown.component.scss index fe65d6e7e..4c8a591aa 100644 --- a/client/src/app/shared/shared-main/buttons/action-dropdown.component.scss +++ b/client/src/app/shared/shared-main/buttons/action-dropdown.component.scss @@ -53,6 +53,8 @@ } .dropdown-menu { + max-width: 75vw; + .dropdown-header { padding: 0.2rem 1rem; } @@ -72,3 +74,13 @@ } } } + +.item-label { + display: flex; + flex-direction: column; + min-width: 1px; + + > * { + @include ellipsis; + } +} diff --git a/engines.yaml b/engines.yaml deleted file mode 100644 index 5a68ca4ba..000000000 --- a/engines.yaml +++ /dev/null @@ -1,5 +0,0 @@ -node: ">=12.x" -yarn: ">=1.x" -postgres: ">=10.x" -redis-server: ">=2.8.18" -ffmpeg: ">=4.1" diff --git a/server/controllers/bots.ts b/server/controllers/bots.ts index 2a8d6863a..a5ce1d79f 100644 --- a/server/controllers/bots.ts +++ b/server/controllers/bots.ts @@ -1,7 +1,8 @@ import { getServerActor } from '@server/models/application/application' +import { logger } from '@uploadx/core' import express from 'express' import { truncate } from 'lodash' -import { SitemapStream, streamToPromise } from 'sitemap' +import { SitemapStream, streamToPromise, ErrorLevel } from 'sitemap' import { buildNSFWFilter } from '../helpers/express-utils' import { ROUTE_CACHE_LIFETIME, WEBSERVER } from '../initializers/constants' import { asyncMiddleware } from '../middlewares' @@ -34,7 +35,18 @@ async function getSitemap (req: express.Request, res: express.Response) { urls = urls.concat(await getSitemapVideoChannelUrls()) urls = urls.concat(await getSitemapAccountUrls()) - const sitemapStream = new SitemapStream({ hostname: WEBSERVER.URL }) + const sitemapStream = new SitemapStream({ + hostname: WEBSERVER.URL, + errorHandler: (err: Error, level: ErrorLevel) => { + if (level === 'warn') { + logger.warn('Warning in sitemap generation.', { err }) + } else if (level === 'throw') { + logger.error('Error in sitemap generation.', { err }) + + throw err + } + } + }) for (const urlObj of urls) { sitemapStream.write(urlObj) @@ -83,7 +95,8 @@ async function getSitemapLocalVideoUrls () { url: WEBSERVER.URL + v.getWatchStaticPath(), video: [ { - title: v.name, + // Sitemap title should be < 100 characters + title: truncate(v.name, { length: 100, omission: '...' }), // Sitemap description should be < 2000 characters description: truncate(v.description || v.name, { length: 2000, omission: '...' }), player_loc: WEBSERVER.URL + v.getEmbedStaticPath(), diff --git a/server/tests/api/notifications/moderation-notifications.ts b/server/tests/api/notifications/moderation-notifications.ts index da9bd1196..fc953f144 100644 --- a/server/tests/api/notifications/moderation-notifications.ts +++ b/server/tests/api/notifications/moderation-notifications.ts @@ -601,7 +601,7 @@ describe('Test moderation notifications', function () { }) it('Should not send a notification to moderators on new video without auto-blacklist', async function () { - this.timeout(60000) + this.timeout(120000) const name = 'video without auto-blacklist ' + buildUUID() diff --git a/server/tests/misc-endpoints.ts b/server/tests/misc-endpoints.ts index 9e404b549..663ac044a 100644 --- a/server/tests/misc-endpoints.ts +++ b/server/tests/misc-endpoints.ts @@ -3,6 +3,7 @@ import { expect } from 'chai' import { cleanupTests, createSingleServer, makeGetRequest, PeerTubeServer, setAccessTokensToServers } from '@shared/server-commands' import { HttpStatusCode, VideoPrivacy } from '@shared/models' +import { expectLogDoesNotContain } from './shared' describe('Test misc endpoints', function () { let server: PeerTubeServer @@ -183,6 +184,23 @@ describe('Test misc endpoints', function () { expect(res.text).to.contain('http://localhost:' + server.port + '/accounts/user1') expect(res.text).to.contain('http://localhost:' + server.port + '/accounts/user2') }) + + it('Should not fail with big title/description videos', async function () { + const name = 'v'.repeat(115) + + await server.videos.upload({ attributes: { name, description: 'd'.repeat(2500), nsfw: false } }) + + const res = await makeGetRequest({ + url: server.url, + path: '/sitemap.xml?t=2', // avoid using cache + expectedStatus: HttpStatusCode.OK_200 + }) + + await expectLogDoesNotContain(server, 'Warning in sitemap generation') + await expectLogDoesNotContain(server, 'Error in sitemap generation') + + expect(res.text).to.contain(`${'v'.repeat(97)}...`) + }) }) after(async function () { diff --git a/support/doc/dependencies.md b/support/doc/dependencies.md index adce70c97..bf53b8080 100644 --- a/support/doc/dependencies.md +++ b/support/doc/dependencies.md @@ -2,7 +2,16 @@ :warning: **Warning**: dependencies guide is maintained by the community. Some parts may be outdated! :warning: -Follow the below guides, and check their versions match [required external dependencies versions](https://github.com/Chocobozzz/PeerTube/blob/master/engines.yaml). You can check them automatically via `sudo npx engineslist`. +Follow the below guides, and check their versions match [required external dependencies versions](https://github.com/Chocobozzz/PeerTube/blob/master/engines.yaml). + +Main dependencies version supported by PeerTube: + + * `node` >=14.x + * `yarn` >=1.x + * `postgres` >=10.x + * `redis-server` >=5.x + * `ffmpeg` >=4.3 + _note_: only **LTS** versions of external dependencies are supported. If no LTS version matching the version constraint is available, only **release** versions are supported. @@ -64,6 +73,7 @@ sudo apt update sudo apt install certbot nginx ffmpeg postgresql postgresql-contrib openssl g++ make redis-server git cron wget ffmpeg -version # Should be >= 4.1 g++ -v # Should be >= 5.x +redis-server --version # Should be >= 5.x ``` Now that dependencies are installed, before running PeerTube you should start PostgreSQL and Redis: @@ -263,6 +273,7 @@ This is necessary because `ffmpeg` is not in the Fedora repos. sudo dnf install nginx ffmpeg postgresql-server postgresql-contrib openssl gcc-c++ make redis git vim ffmpeg -version # Should be >= 4.1 g++ -v # Should be >= 5.x +redis-server --version # Should be >= 5.x ``` 8. Configure nginx