mirror of
https://git.cloudron.io/cloudron/peertube-app.git
synced 2024-09-28 22:41:56 +00:00
Compare commits
29 commits
Author | SHA1 | Date | |
---|---|---|---|
|
9eea2f2e29 | ||
|
1f1df0971b | ||
|
9c07e658ba | ||
|
c9e4392fd3 | ||
|
70a6487409 | ||
|
1ef5ac6f04 | ||
|
cf76785d51 | ||
|
b93429a414 | ||
|
6edd1cf5c2 | ||
|
9b5bcc61c6 | ||
|
3ec04d6700 | ||
|
8f22984b99 | ||
|
7938a5b4d2 | ||
|
f4d628624e | ||
|
89c32aad8f | ||
|
46feafc923 | ||
|
c348b44294 | ||
|
cad464a8c8 | ||
|
539cce44d1 | ||
|
252cee6e1c | ||
|
942b937a8f | ||
|
0bd51a6143 | ||
|
a54fd42ce9 | ||
|
90c7834d38 | ||
|
6021c34466 | ||
|
a2776ec87f | ||
|
441b8dba99 | ||
|
6f63008dd3 | ||
|
f97551091d |
8 changed files with 795 additions and 320 deletions
51
CHANGELOG.md
51
CHANGELOG.md
|
@ -294,3 +294,54 @@ Update web browsers support list:
|
||||||
[2.15.0]
|
[2.15.0]
|
||||||
* Migrate to OIDC login
|
* Migrate to OIDC login
|
||||||
|
|
||||||
|
[2.15.1]
|
||||||
|
* Update PeerTube to 6.0.3
|
||||||
|
* [Full changelog](https://github.com/Chocobozzz/PeerTube/releases/tag/v6.0.3)
|
||||||
|
* Fix HTML meta tags with attributes that contain quotes
|
||||||
|
* Fix time parsing resulting in broken video start time in some cases
|
||||||
|
* Fix WebTorrent video import crash
|
||||||
|
* Reload Discover page on logout
|
||||||
|
* Fix privacy error when updating a live, even if the privacy has not changed
|
||||||
|
* Fix invalid remote live state change notification that causes the player to reload
|
||||||
|
* Don't apply big play button skin to settings menu
|
||||||
|
* Fix downloading video files from object storage with some video names (that include emojis, quotes etc)
|
||||||
|
|
||||||
|
[2.15.2]
|
||||||
|
* Update PeerTube to 6.0.4
|
||||||
|
* [Full changelog](https://github.com/Chocobozzz/PeerTube/releases/tag/v6.0.4)
|
||||||
|
* Important: Prevent XSS injection in embed. Thanks Syst3m0ver!
|
||||||
|
|
||||||
|
[2.16.0]
|
||||||
|
* Update PeerTube to 6.1.0
|
||||||
|
* [Full changelog](https://github.com/Chocobozzz/PeerTube/releases/tag/v6.1.0)
|
||||||
|
* Compact ActivityPub JSON-LD objects before using them to prevent incorrect access control @tesaguri
|
||||||
|
* Protect ActivityPub information related to private/internal/blocked videos
|
||||||
|
|
||||||
|
[2.17.0]
|
||||||
|
* Update PeerTube to 6.2.0
|
||||||
|
* [Full changelog](https://github.com/Chocobozzz/PeerTube/releases/tag/v6.2.0)
|
||||||
|
|
||||||
|
[2.17.1]
|
||||||
|
* Update PeerTube to 6.2.1
|
||||||
|
* [Full changelog](https://github.com/Chocobozzz/PeerTube/releases/tag/v6.2.1)
|
||||||
|
* Fix stuck runner jobs due to DB concurrency issue
|
||||||
|
* Respect OS orientation settings in PWA
|
||||||
|
* Fix "No results" not displayed on no video results
|
||||||
|
* Do not display "Download" option on lives
|
||||||
|
* Fix invalid current password error when updating user password
|
||||||
|
* Fix slow hotkeys detection
|
||||||
|
* Fix hidden runner jobs tab when remote runner is only enabled for transcription
|
||||||
|
* Fix broken HLS P2P by correctly updating HLS infohash on privacy update
|
||||||
|
* Fix videos filters pastille labels for categories and languages
|
||||||
|
|
||||||
|
[3.0.0]
|
||||||
|
* After the update to refresh metadata: run the `migrate` command in a webterminal into the app.
|
||||||
|
* Update PeerTube to 6.3.0
|
||||||
|
* [Full changelog](https://github.com/Chocobozzz/PeerTube/releases/tag/v6.3.0)
|
||||||
|
|
||||||
|
[3.0.1]
|
||||||
|
* Update PeerTube to 6.3.1
|
||||||
|
* [Full changelog](https://github.com/Chocobozzz/PeerTube/releases/tag/v6.3.1)
|
||||||
|
* Fix player settings button on mobile
|
||||||
|
* Fix removed audio when splitting audio and video streams on existing videos when running HLS transcoding
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"version": "2.15.0",
|
"version": "3.0.1",
|
||||||
"upstreamVersion": "6.0.2",
|
"upstreamVersion": "6.3.1",
|
||||||
"id": "org.joinpeertube.cloudronapp",
|
"id": "org.joinpeertube.cloudronapp",
|
||||||
"title": "PeerTube",
|
"title": "PeerTube",
|
||||||
"author": "PeerTube developers",
|
"author": "PeerTube developers",
|
||||||
|
|
|
@ -5,7 +5,11 @@ WORKDIR /app/code/server
|
||||||
|
|
||||||
RUN apt update && apt install -y prosody && rm -rf /var/cache/apt /var/lib/apt/lists
|
RUN apt update && apt install -y prosody && rm -rf /var/cache/apt /var/lib/apt/lists
|
||||||
|
|
||||||
ARG VERSION=6.0.2
|
ARG NODE_VERSION=20.15.1
|
||||||
|
RUN mkdir -p /usr/local/node-${NODE_VERSION} && curl -L https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.gz | tar zxf - --strip-components 1 -C /usr/local/node-${NODE_VERSION}
|
||||||
|
ENV PATH /usr/local/node-${NODE_VERSION}/bin:$PATH
|
||||||
|
|
||||||
|
ARG VERSION=6.3.1
|
||||||
|
|
||||||
# install peertube. the chown is required for some reason for ffmpeg. it fails with EROFS without it when transcoding
|
# install peertube. the chown is required for some reason for ffmpeg. it fails with EROFS without it when transcoding
|
||||||
RUN curl -sL https://github.com/Chocobozzz/PeerTube/releases/download/v${VERSION}/peertube-v${VERSION}.tar.xz | tar --strip-components 1 -Jxvf - && \
|
RUN curl -sL https://github.com/Chocobozzz/PeerTube/releases/download/v${VERSION}/peertube-v${VERSION}.tar.xz | tar --strip-components 1 -Jxvf - && \
|
||||||
|
@ -31,6 +35,8 @@ ENV NODE_CONFIG_DIR /app/code/server/config
|
||||||
|
|
||||||
RUN printf '#!/bin/bash\n\ncd /app/code/cli && node dist/server/tools/peertube.js $@\n' > /usr/bin/peertube && chmod +x /usr/bin/peertube
|
RUN printf '#!/bin/bash\n\ncd /app/code/cli && node dist/server/tools/peertube.js $@\n' > /usr/bin/peertube && chmod +x /usr/bin/peertube
|
||||||
|
|
||||||
|
# remove with next releases
|
||||||
|
RUN printf '#!/bin/bash\n\ncd /app/code/server && NODE_ENV=production node dist/scripts/migrations/peertube-6.3.js $@\n' > /usr/bin/migrate && chmod +x /usr/bin/migrate
|
||||||
|
|
||||||
# add nginx config
|
# add nginx config
|
||||||
RUN rm /etc/nginx/sites-enabled/*
|
RUN rm /etc/nginx/sites-enabled/*
|
||||||
|
|
|
@ -36,6 +36,13 @@ server {
|
||||||
try_files /dev/null @api;
|
try_files /dev/null @api;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
location ~ ^/api/v1/users/[^/]+/imports/import-resumable$ {
|
||||||
|
client_max_body_size 0;
|
||||||
|
proxy_request_buffering off;
|
||||||
|
|
||||||
|
try_files /dev/null @api;
|
||||||
|
}
|
||||||
|
|
||||||
location ~ ^/api/v1/videos/(upload|([^/]+/studio/edit))$ {
|
location ~ ^/api/v1/videos/(upload|([^/]+/studio/edit))$ {
|
||||||
limit_except POST HEAD { deny all; }
|
limit_except POST HEAD { deny all; }
|
||||||
|
|
||||||
|
@ -153,7 +160,7 @@ server {
|
||||||
alias /app/code/server/client/dist/$1;
|
alias /app/code/server/client/dist/$1;
|
||||||
}
|
}
|
||||||
|
|
||||||
location ~ ^(/static/(webseed|web-videos|streaming-playlists)/private/)|^/download {
|
location ~ ^(/static/(webseed|web-videos|streaming-playlists/hls)/private/)|^/download {
|
||||||
# We can't rate limit a try_files directive, so we need to duplicate @api
|
# We can't rate limit a try_files directive, so we need to duplicate @api
|
||||||
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
|
3
start.sh
3
start.sh
|
@ -110,6 +110,9 @@ update_config() {
|
||||||
yq eval "del(.storage.videos)" -i /app/data/production.yaml
|
yq eval "del(.storage.videos)" -i /app/data/production.yaml
|
||||||
yq eval "del(.transcoding.webtorrent)" -i /app/data/production.yaml
|
yq eval "del(.transcoding.webtorrent)" -i /app/data/production.yaml
|
||||||
yq eval ".transcoding.web_videos.enabled = true" -i /app/data/production.yaml
|
yq eval ".transcoding.web_videos.enabled = true" -i /app/data/production.yaml
|
||||||
|
|
||||||
|
# changes for 6.1.0
|
||||||
|
yq eval ".storage.original_video_files = \"/app/data/storage/original_video_files/\"" -i /app/data/production.yaml
|
||||||
}
|
}
|
||||||
|
|
||||||
echo "==> Changing ownership"
|
echo "==> Changing ownership"
|
||||||
|
|
1016
test/package-lock.json
generated
1016
test/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -10,11 +10,11 @@
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"expect.js": "^0.3.1",
|
"expect.js": "^0.3.1",
|
||||||
"mocha": "^10.2.0"
|
"mocha": "^10.7.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chromedriver": "^120.0.1",
|
"chromedriver": "^129.0.0",
|
||||||
"safetydance": "^2.4.0",
|
"safetydance": "^2.4.0",
|
||||||
"selenium-webdriver": "^4.16.0"
|
"selenium-webdriver": "^4.25.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
24
test/test.js
24
test/test.js
|
@ -19,8 +19,6 @@ const execSync = require('child_process').execSync,
|
||||||
{ Builder, By, Key, until } = require('selenium-webdriver'),
|
{ Builder, By, Key, until } = require('selenium-webdriver'),
|
||||||
{ Options } = require('selenium-webdriver/chrome');
|
{ Options } = require('selenium-webdriver/chrome');
|
||||||
|
|
||||||
const rl = readlinePromises.createInterface({ input: process.stdin, output: process.stdout });
|
|
||||||
|
|
||||||
if (!process.env.USERNAME || !process.env.PASSWORD || !process.env.EMAIL) {
|
if (!process.env.USERNAME || !process.env.PASSWORD || !process.env.EMAIL) {
|
||||||
console.log('USERNAME, EMAIL and PASSWORD env vars need to be set');
|
console.log('USERNAME, EMAIL and PASSWORD env vars need to be set');
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
|
@ -90,12 +88,10 @@ describe('Application life cycle test', function () {
|
||||||
await browser.sleep(2000);
|
await browser.sleep(2000);
|
||||||
|
|
||||||
if (!athenticated_by_oidc) {
|
if (!athenticated_by_oidc) {
|
||||||
await waitForElement(By.xpath('//input[@name="username"]'));
|
await waitForElement(By.id('inputUsername'));
|
||||||
await browser.findElement(By.xpath('//input[@name="username"]')).sendKeys(username);
|
await browser.findElement(By.id('inputUsername')).sendKeys(username);
|
||||||
await browser.findElement(By.xpath('//input[@name="password"]')).sendKeys(password);
|
await browser.findElement(By.id('inputPassword')).sendKeys(password);
|
||||||
await browser.sleep(2000);
|
await browser.findElement(By.id('loginSubmitButton')).click();
|
||||||
await browser.findElement(By.xpath('//button[@type="submit" and contains(text(), "Sign in")]')).click();
|
|
||||||
await browser.sleep(2000);
|
|
||||||
|
|
||||||
athenticated_by_oidc = true;
|
athenticated_by_oidc = true;
|
||||||
}
|
}
|
||||||
|
@ -106,6 +102,7 @@ describe('Application life cycle test', function () {
|
||||||
async function closeAccountSetupDialog() {
|
async function closeAccountSetupDialog() {
|
||||||
await browser.get('https://' + app.fqdn);
|
await browser.get('https://' + app.fqdn);
|
||||||
|
|
||||||
|
await waitForElement(By.xpath('//span[contains(text(), "show me this anymore")]'));
|
||||||
await browser.findElement(By.xpath('//span[contains(text(), "show me this anymore")]')).click();
|
await browser.findElement(By.xpath('//span[contains(text(), "show me this anymore")]')).click();
|
||||||
await browser.findElement(By.xpath('//a[contains(text(), "Set up")]')).click();
|
await browser.findElement(By.xpath('//a[contains(text(), "Set up")]')).click();
|
||||||
await browser.sleep(3000);
|
await browser.sleep(3000);
|
||||||
|
@ -131,16 +128,19 @@ describe('Application life cycle test', function () {
|
||||||
if (error) return; // sometimes it doesn't appear, maybe it's cached in local storage
|
if (error) return; // sometimes it doesn't appear, maybe it's cached in local storage
|
||||||
await browser.findElement(By.xpath('//a[contains(text(), "Configure my instance")]')).click(); // this opens a new window
|
await browser.findElement(By.xpath('//a[contains(text(), "Configure my instance")]')).click(); // this opens a new window
|
||||||
|
|
||||||
let say_cmd = await getOS() == "Darwin" ? "say" : "spd-say";
|
const say_cmd = await getOS() == "Darwin" ? "say" : "spd-say";
|
||||||
execSync(`${say_cmd} "Close the newly opened configuration tab."`);
|
execSync(`${say_cmd} "Close the newly opened configuration tab."`);
|
||||||
|
|
||||||
|
const rl = readlinePromises.createInterface({ input: process.stdin, output: process.stdout });
|
||||||
await rl.question('Is tab closed? ');
|
await rl.question('Is tab closed? ');
|
||||||
}
|
}
|
||||||
|
|
||||||
async function uploadVideo() {
|
async function uploadVideo() {
|
||||||
browser.get('https://' + app.fqdn + '/videos/upload');
|
await browser.get(`https://${app.fqdn}/videos/upload#upload`);
|
||||||
await browser.sleep(2000);
|
await browser.sleep(3000);
|
||||||
await browser.findElement(By.xpath('//input[@id="videofile" and @type="file"]')).sendKeys(path.resolve(__dirname, './Cloudron Test Video.mp4'));
|
await browser.wait(until.elementLocated(By.id('videofile')), TEST_TIMEOUT); // do not do element visible check . it fails, no clue why
|
||||||
|
await browser.findElement(By.id('videofile')).sendKeys(path.resolve(__dirname, './Cloudron Test Video.mp4'));
|
||||||
|
console.log('waiting 10 seconds for upload');
|
||||||
await browser.sleep(10000); // wait for upload
|
await browser.sleep(10000); // wait for upload
|
||||||
|
|
||||||
await waitForElement(By.xpath('//div[@class="submit-container"]//span[text()="Publish"]'));
|
await waitForElement(By.xpath('//div[@class="submit-container"]//span[text()="Publish"]'));
|
||||||
|
|
Loading…
Reference in a new issue