Merge pull request #5341 from pixelfed/staging

v0.12.4
This commit is contained in:
daniel 2024-11-08 22:10:48 -07:00 committed by GitHub
commit 65dd601a02
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
44 changed files with 1174 additions and 1068 deletions

View file

@ -1,6 +1,9 @@
# Release Notes # Release Notes
## [Unreleased](https://github.com/pixelfed/pixelfed/compare/v0.12.3...dev) ## [Unreleased](https://github.com/pixelfed/pixelfed/compare/v0.12.3...dev)
- ([](https://github.com/pixelfed/pixelfed/commit/))
## [v0.12.4 (2024-11-08)](https://github.com/pixelfed/pixelfed/compare/v0.12.4...dev)
### Added ### Added
- Implement Admin Domain Blocks API (Mastodon API Compatible) [ThisIsMissEm](https://github.com/ThisIsMissEm) ([#5021](https://github.com/pixelfed/pixelfed/pull/5021)) - Implement Admin Domain Blocks API (Mastodon API Compatible) [ThisIsMissEm](https://github.com/ThisIsMissEm) ([#5021](https://github.com/pixelfed/pixelfed/pull/5021))
@ -36,7 +39,7 @@
- Update config, allow Beagle discover service to be disabled ([de4ce3c8](https://github.com/pixelfed/pixelfed/commit/de4ce3c8)) - Update config, allow Beagle discover service to be disabled ([de4ce3c8](https://github.com/pixelfed/pixelfed/commit/de4ce3c8))
- Update ApiV1Dot1Controller, allow upto 5 similar push tokens ([7820b506](https://github.com/pixelfed/pixelfed/commit/7820b506)) - Update ApiV1Dot1Controller, allow upto 5 similar push tokens ([7820b506](https://github.com/pixelfed/pixelfed/commit/7820b506))
- Update AdminReports, add missing click handler. Fixes #5332 ([fe48b8ad](https://github.com/pixelfed/pixelfed/commit/fe48b8ad)) - Update AdminReports, add missing click handler. Fixes #5332 ([fe48b8ad](https://github.com/pixelfed/pixelfed/commit/fe48b8ad))
- ([](https://github.com/pixelfed/pixelfed/commit/)) - Improve media filtering by using OffscreenCanvas, if supported ([aea5392](https://github.com/pixelfed/pixelfed/commit/aea5392))
## [v0.12.3 (2024-07-01)](https://github.com/pixelfed/pixelfed/compare/v0.12.2...v0.12.3) ## [v0.12.3 (2024-07-01)](https://github.com/pixelfed/pixelfed/compare/v0.12.2...v0.12.3)

View file

@ -194,6 +194,7 @@ FROM --platform=${BUILDARCH} node:lts AS frontend-build
ARG BUILDARCH ARG BUILDARCH
ARG BUILD_FRONTEND=0 ARG BUILD_FRONTEND=0
ARG RUNTIME_UID ARG RUNTIME_UID
ARG RUNTIME_GID
ARG NODE_ENV=production ARG NODE_ENV=production
ENV NODE_ENV=$NODE_ENV ENV NODE_ENV=$NODE_ENV
@ -256,17 +257,26 @@ COPY --link --from=composer-image /usr/bin/composer /usr/bin/composer
#! Changing user to runtime user #! Changing user to runtime user
USER ${RUNTIME_UID}:${RUNTIME_GID} USER ${RUNTIME_UID}:${RUNTIME_GID}
# Install composer dependencies # Install composer dependencies
# NOTE: we skip the autoloader generation here since we don't have all files avaliable (yet) # NOTE: we skip the autoloader generation here since we don't have all files avaliable (yet)
RUN --mount=type=cache,id=pixelfed-composer-${PHP_VERSION},sharing=locked,target=/cache/composer \ RUN --mount=type=cache,id=pixelfed-composer-${PHP_VERSION},sharing=locked,uid=${RUNTIME_UID},gid=${RUNTIME_GID},target=/cache/composer \
--mount=type=bind,source=composer.json,target=/var/www/composer.json \ --mount=type=bind,source=composer.json,target=/var/www/composer.json \
--mount=type=bind,source=composer.lock,target=/var/www/composer.lock \ --mount=type=bind,source=composer.lock,target=/var/www/composer.lock \
set -ex \ set -ex \
&& composer install --prefer-dist --no-autoloader --ignore-platform-reqs && composer install --prefer-dist --no-autoloader --ignore-platform-reqs --no-scripts
# Copy all other files over # Copy all other files over
COPY --chown=${RUNTIME_UID}:${RUNTIME_GID} . /var/www/ COPY --chown=${RUNTIME_UID}:${RUNTIME_GID} . /var/www/
# Generate optimized autoloader now that we have all files around
RUN set -ex \
&& ENABLE_CONFIG_CACHE=false composer dump-autoload --optimize
# Now we can run the post-install scripts
RUN set -ex \
&& composer run-script post-update-cmd
####################################################### #######################################################
# Runtime: base # Runtime: base
####################################################### #######################################################
@ -286,13 +296,6 @@ COPY --link --from=composer-image /usr/bin/composer /usr/bin/composer
COPY --link --from=composer-and-src --chown=${RUNTIME_UID}:${RUNTIME_GID} /var/www /var/www COPY --link --from=composer-and-src --chown=${RUNTIME_UID}:${RUNTIME_GID} /var/www /var/www
COPY --link --from=frontend-build --chown=${RUNTIME_UID}:${RUNTIME_GID} /var/www/public /var/www/public COPY --link --from=frontend-build --chown=${RUNTIME_UID}:${RUNTIME_GID} /var/www/public /var/www/public
#! Changing user to runtime user
USER ${RUNTIME_UID}:${RUNTIME_GID}
# Generate optimized autoloader now that we have all files around
RUN set -ex \
&& ENABLE_CONFIG_CACHE=false composer dump-autoload --optimize
USER root USER root
# for detail why storage is copied this way, pls refer to https://github.com/pixelfed/pixelfed/pull/2137#discussion_r434468862 # for detail why storage is copied this way, pls refer to https://github.com/pixelfed/pixelfed/pull/2137#discussion_r434468862

46
composer.lock generated
View file

@ -62,16 +62,16 @@
}, },
{ {
"name": "aws/aws-sdk-php", "name": "aws/aws-sdk-php",
"version": "3.325.3", "version": "3.325.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/aws/aws-sdk-php.git", "url": "https://github.com/aws/aws-sdk-php.git",
"reference": "de0b289c7260fb19301ffa2eb724de2076daad74" "reference": "195d003c902a741de53008c839cbcebddbe1f326"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/de0b289c7260fb19301ffa2eb724de2076daad74", "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/195d003c902a741de53008c839cbcebddbe1f326",
"reference": "de0b289c7260fb19301ffa2eb724de2076daad74", "reference": "195d003c902a741de53008c839cbcebddbe1f326",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -154,9 +154,9 @@
"support": { "support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"issues": "https://github.com/aws/aws-sdk-php/issues", "issues": "https://github.com/aws/aws-sdk-php/issues",
"source": "https://github.com/aws/aws-sdk-php/tree/3.325.3" "source": "https://github.com/aws/aws-sdk-php/tree/3.325.5"
}, },
"time": "2024-11-06T19:05:22+00:00" "time": "2024-11-08T19:12:57+00:00"
}, },
{ {
"name": "bacon/bacon-qr-code", "name": "bacon/bacon-qr-code",
@ -3113,16 +3113,16 @@
}, },
{ {
"name": "lcobucci/jwt", "name": "lcobucci/jwt",
"version": "5.4.1", "version": "5.4.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/lcobucci/jwt.git", "url": "https://github.com/lcobucci/jwt.git",
"reference": "848815d2287abd5d3c285482f8e1f501b289a2e7" "reference": "ea1ce71cbf9741e445a5914e2f67cdbb484ff712"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/lcobucci/jwt/zipball/848815d2287abd5d3c285482f8e1f501b289a2e7", "url": "https://api.github.com/repos/lcobucci/jwt/zipball/ea1ce71cbf9741e445a5914e2f67cdbb484ff712",
"reference": "848815d2287abd5d3c285482f8e1f501b289a2e7", "reference": "ea1ce71cbf9741e445a5914e2f67cdbb484ff712",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3170,7 +3170,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/lcobucci/jwt/issues", "issues": "https://github.com/lcobucci/jwt/issues",
"source": "https://github.com/lcobucci/jwt/tree/5.4.1" "source": "https://github.com/lcobucci/jwt/tree/5.4.2"
}, },
"funding": [ "funding": [
{ {
@ -3182,7 +3182,7 @@
"type": "patreon" "type": "patreon"
} }
], ],
"time": "2024-11-06T06:16:04+00:00" "time": "2024-11-07T12:54:35+00:00"
}, },
{ {
"name": "league/commonmark", "name": "league/commonmark",
@ -4296,16 +4296,16 @@
}, },
{ {
"name": "nesbot/carbon", "name": "nesbot/carbon",
"version": "3.8.1", "version": "3.8.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/briannesbitt/Carbon.git", "url": "https://github.com/briannesbitt/Carbon.git",
"reference": "10ac0aa86b8062219ce21e8189123d611ca3ecd9" "reference": "e1268cdbc486d97ce23fef2c666dc3c6b6de9947"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/10ac0aa86b8062219ce21e8189123d611ca3ecd9", "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/e1268cdbc486d97ce23fef2c666dc3c6b6de9947",
"reference": "10ac0aa86b8062219ce21e8189123d611ca3ecd9", "reference": "e1268cdbc486d97ce23fef2c666dc3c6b6de9947",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4398,7 +4398,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-11-03T16:02:24+00:00" "time": "2024-11-07T17:46:48+00:00"
}, },
{ {
"name": "nette/schema", "name": "nette/schema",
@ -10918,16 +10918,16 @@
}, },
{ {
"name": "myclabs/deep-copy", "name": "myclabs/deep-copy",
"version": "1.12.0", "version": "1.12.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/myclabs/DeepCopy.git", "url": "https://github.com/myclabs/DeepCopy.git",
"reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845",
"reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -10966,7 +10966,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/myclabs/DeepCopy/issues", "issues": "https://github.com/myclabs/DeepCopy/issues",
"source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1"
}, },
"funding": [ "funding": [
{ {
@ -10974,7 +10974,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-06-12T14:39:25+00:00" "time": "2024-11-08T17:47:46+00:00"
}, },
{ {
"name": "nunomaduro/collision", "name": "nunomaduro/collision",

View file

@ -23,7 +23,7 @@ return [
| This value is the version of your Pixelfed instance. | This value is the version of your Pixelfed instance.
| |
*/ */
'version' => '0.12.3', 'version' => '0.12.4',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------

2063
package-lock.json generated

File diff suppressed because it is too large Load diff

Binary file not shown.

Binary file not shown.

BIN
public/js/compose.js vendored

Binary file not shown.

View file

@ -0,0 +1 @@
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */

BIN
public/js/manifest.js vendored

Binary file not shown.

View file

@ -0,0 +1 @@
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */

BIN
public/js/vendor.js vendored

Binary file not shown.

Binary file not shown.

View file

@ -1095,11 +1095,12 @@ export default {
}, },
defineErrorMessage(errObject) { defineErrorMessage(errObject) {
let msg;
if (errObject.response) { if (errObject.response) {
let msg = errObject.response.data.message ? errObject.response.data.message : 'An unexpected error occured.'; msg = errObject.response.data.message ? errObject.response.data.message : 'An unexpected error occured.';
} }
else { else {
let msg = errObject.message; msg = errObject.message;
} }
return swal('Oops, something went wrong!', msg, 'error'); return swal('Oops, something went wrong!', msg, 'error');
}, },
@ -1765,57 +1766,91 @@ export default {
applyFilterToMedia() { applyFilterToMedia() {
// this is where the magic happens // this is where the magic happens
var ua = navigator.userAgent.toLowerCase();
if(ua.indexOf('firefox') == -1 && ua.indexOf('chrome') == -1) {
this.isPosting = false;
swal('Oops!', 'Your browser does not support the filter feature.', 'error');
this.page = 3;
return;
}
let count = this.media.filter(m => m.filter_class).length; let count = this.media.filter(m => m.filter_class).length;
if(count) { if(count) {
this.page = 'filteringMedia'; this.page = 'filteringMedia';
this.filteringRemainingCount = count; this.filteringRemainingCount = count;
this.$nextTick(() => { this.$nextTick(() => {
this.isFilteringMedia = true; this.isFilteringMedia = true;
this.media.forEach((media, idx) => this.applyFilterToMediaSave(media, idx)); Promise.all(this.media.map(media => {
return this.applyFilterToMediaSave(media);
})).catch(err => {
console.error(err);
swal('Oops!', 'An error occurred while applying filters to your media. Please refresh the page and try again. If the problem persist, please try a different web browser.', 'error');
});
}) })
} else { } else {
this.page = 3; this.page = 3;
} }
}, },
applyFilterToMediaSave(media, idx) { async applyFilterToMediaSave(media) {
if(!media.filter_class) { if(!media.filter_class) {
return; return;
} }
let self = this; // Load image
let data = null; const image = document.createElement('img');
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
let image = document.createElement('img');
image.src = media.url; image.src = media.url;
image.addEventListener('load', e => { await new Promise((resolve, reject) => {
image.addEventListener('load', () => resolve());
image.addEventListener('error', () => {
reject(new Error('Failed to load image'));
});
});
// Create canvas
let canvas;
let usingOffscreenCanvas = false;
if('OffscreenCanvas' in window) {
canvas = new OffscreenCanvas(image.width, image.height);
usingOffscreenCanvas = true;
} else {
canvas = document.createElement('canvas');
canvas.width = image.width; canvas.width = image.width;
canvas.height = image.height; canvas.height = image.height;
ctx.filter = App.util.filterCss[media.filter_class]; }
ctx.drawImage(image, 0, 0, image.width, image.height);
ctx.save(); // Draw image with filter to canvas
canvas.toBlob(function(blob) { const ctx = canvas.getContext('2d');
data = new FormData(); if (!ctx) {
data.append('file', blob); throw new Error('Failed to get canvas context');
data.append('id', media.id); }
axios.post('/api/compose/v0/media/update', data) if (!('filter' in ctx)) {
.then(res => { throw new Error('Canvas filter not supported');
self.media[idx].is_filtered = true; }
self.updateFilteringMedia(); ctx.filter = App.util.filterCss[media.filter_class];
}).catch(err => { ctx.drawImage(image, 0, 0, image.width, image.height);
}); ctx.save();
// Convert canvas to blob
let blob;
if(usingOffscreenCanvas) {
blob = await canvas.convertToBlob({
type: media.mime,
quality: 1,
}); });
}, media.mime, 0.9); } else {
ctx.clearRect(0, 0, image.width, image.height); blob = await new Promise((resolve, reject) => {
canvas.toBlob(blob => {
if(blob) {
resolve(blob);
} else {
reject(
new Error('Failed to convert canvas to blob'),
);
}
}, media.mime, 1);
});
}
// Upload blob / Update media
const data = new FormData();
data.append('file', blob);
data.append('id', media.id);
await axios.post('/api/compose/v0/media/update', data);
media.is_filtered = true;
this.updateFilteringMedia();
}, },
updateFilteringMedia() { updateFilteringMedia() {

View file

@ -13,7 +13,7 @@
<p class="text-center font-weight-bold">How to get your export data from Instagram:</p> <p class="text-center font-weight-bold">How to get your export data from Instagram:</p>
<ol class="pb-4"> <ol class="pb-4">
<li class="mb-2"> <li class="mb-2">
<span>Follow the Instagram instructions on <strong>Downloading a copy of your data on Instagram</strong> on <a href="https://help.instagram.com/181231772500920" class="font-weight-bold">this page</a>. <strong class="text-danger small font-weight-bold">Make sure you select the JSON format</strong></span> <span><strong>Download your information in Instagram's Accounts Center</strong> on <a href="https://www.instagram.com/download/request" class="font-weight-bold">this page</a>. <strong class="text-danger small font-weight-bold">Make sure you select the JSON format</strong></span>
</li> </li>
<li class="mb-2"> <li class="mb-2">
<span>Wait for the email from Instagram with your download link</span> <span>Wait for the email from Instagram with your download link</span>