mirror of
https://github.com/pixelfed/pixelfed.git
synced 2024-12-18 11:03:17 +00:00
commit
65dd601a02
44 changed files with 1174 additions and 1068 deletions
|
@ -1,6 +1,9 @@
|
|||
# Release Notes
|
||||
|
||||
## [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
|
||||
- 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 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))
|
||||
- ([](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)
|
||||
|
||||
|
|
21
Dockerfile
21
Dockerfile
|
@ -194,6 +194,7 @@ FROM --platform=${BUILDARCH} node:lts AS frontend-build
|
|||
ARG BUILDARCH
|
||||
ARG BUILD_FRONTEND=0
|
||||
ARG RUNTIME_UID
|
||||
ARG RUNTIME_GID
|
||||
|
||||
ARG NODE_ENV=production
|
||||
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
|
||||
USER ${RUNTIME_UID}:${RUNTIME_GID}
|
||||
|
||||
|
||||
# Install composer dependencies
|
||||
# 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.lock,target=/var/www/composer.lock \
|
||||
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 --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
|
||||
#######################################################
|
||||
|
@ -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=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
|
||||
|
||||
# for detail why storage is copied this way, pls refer to https://github.com/pixelfed/pixelfed/pull/2137#discussion_r434468862
|
||||
|
|
46
composer.lock
generated
46
composer.lock
generated
|
@ -62,16 +62,16 @@
|
|||
},
|
||||
{
|
||||
"name": "aws/aws-sdk-php",
|
||||
"version": "3.325.3",
|
||||
"version": "3.325.5",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/aws/aws-sdk-php.git",
|
||||
"reference": "de0b289c7260fb19301ffa2eb724de2076daad74"
|
||||
"reference": "195d003c902a741de53008c839cbcebddbe1f326"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/de0b289c7260fb19301ffa2eb724de2076daad74",
|
||||
"reference": "de0b289c7260fb19301ffa2eb724de2076daad74",
|
||||
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/195d003c902a741de53008c839cbcebddbe1f326",
|
||||
"reference": "195d003c902a741de53008c839cbcebddbe1f326",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -154,9 +154,9 @@
|
|||
"support": {
|
||||
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
|
||||
"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",
|
||||
|
@ -3113,16 +3113,16 @@
|
|||
},
|
||||
{
|
||||
"name": "lcobucci/jwt",
|
||||
"version": "5.4.1",
|
||||
"version": "5.4.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/lcobucci/jwt.git",
|
||||
"reference": "848815d2287abd5d3c285482f8e1f501b289a2e7"
|
||||
"reference": "ea1ce71cbf9741e445a5914e2f67cdbb484ff712"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/lcobucci/jwt/zipball/848815d2287abd5d3c285482f8e1f501b289a2e7",
|
||||
"reference": "848815d2287abd5d3c285482f8e1f501b289a2e7",
|
||||
"url": "https://api.github.com/repos/lcobucci/jwt/zipball/ea1ce71cbf9741e445a5914e2f67cdbb484ff712",
|
||||
"reference": "ea1ce71cbf9741e445a5914e2f67cdbb484ff712",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -3170,7 +3170,7 @@
|
|||
],
|
||||
"support": {
|
||||
"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": [
|
||||
{
|
||||
|
@ -3182,7 +3182,7 @@
|
|||
"type": "patreon"
|
||||
}
|
||||
],
|
||||
"time": "2024-11-06T06:16:04+00:00"
|
||||
"time": "2024-11-07T12:54:35+00:00"
|
||||
},
|
||||
{
|
||||
"name": "league/commonmark",
|
||||
|
@ -4296,16 +4296,16 @@
|
|||
},
|
||||
{
|
||||
"name": "nesbot/carbon",
|
||||
"version": "3.8.1",
|
||||
"version": "3.8.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/briannesbitt/Carbon.git",
|
||||
"reference": "10ac0aa86b8062219ce21e8189123d611ca3ecd9"
|
||||
"reference": "e1268cdbc486d97ce23fef2c666dc3c6b6de9947"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/10ac0aa86b8062219ce21e8189123d611ca3ecd9",
|
||||
"reference": "10ac0aa86b8062219ce21e8189123d611ca3ecd9",
|
||||
"url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/e1268cdbc486d97ce23fef2c666dc3c6b6de9947",
|
||||
"reference": "e1268cdbc486d97ce23fef2c666dc3c6b6de9947",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -4398,7 +4398,7 @@
|
|||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-11-03T16:02:24+00:00"
|
||||
"time": "2024-11-07T17:46:48+00:00"
|
||||
},
|
||||
{
|
||||
"name": "nette/schema",
|
||||
|
@ -10918,16 +10918,16 @@
|
|||
},
|
||||
{
|
||||
"name": "myclabs/deep-copy",
|
||||
"version": "1.12.0",
|
||||
"version": "1.12.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/myclabs/DeepCopy.git",
|
||||
"reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c"
|
||||
"reference": "123267b2c49fbf30d78a7b2d333f6be754b94845"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
|
||||
"reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
|
||||
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845",
|
||||
"reference": "123267b2c49fbf30d78a7b2d333f6be754b94845",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -10966,7 +10966,7 @@
|
|||
],
|
||||
"support": {
|
||||
"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": [
|
||||
{
|
||||
|
@ -10974,7 +10974,7 @@
|
|||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"time": "2024-06-12T14:39:25+00:00"
|
||||
"time": "2024-11-08T17:47:46+00:00"
|
||||
},
|
||||
{
|
||||
"name": "nunomaduro/collision",
|
||||
|
|
|
@ -23,7 +23,7 @@ return [
|
|||
| This value is the version of your Pixelfed instance.
|
||||
|
|
||||
*/
|
||||
'version' => '0.12.3',
|
||||
'version' => '0.12.4',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
2063
package-lock.json
generated
2063
package-lock.json
generated
File diff suppressed because it is too large
Load diff
BIN
public/js/compose.chunk.34ebded0861594ef.js
vendored
BIN
public/js/compose.chunk.34ebded0861594ef.js
vendored
Binary file not shown.
BIN
public/js/compose.chunk.e1f297b242137d23.js
vendored
Normal file
BIN
public/js/compose.chunk.e1f297b242137d23.js
vendored
Normal file
Binary file not shown.
BIN
public/js/compose.js
vendored
BIN
public/js/compose.js
vendored
Binary file not shown.
Binary file not shown.
1
public/js/home.chunk.c362371940daf318.js.LICENSE.txt
Normal file
1
public/js/home.chunk.c362371940daf318.js.LICENSE.txt
Normal 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
BIN
public/js/manifest.js
vendored
Binary file not shown.
Binary file not shown.
1
public/js/post.chunk.5f457aeaa4ae598c.js.LICENSE.txt
Normal file
1
public/js/post.chunk.5f457aeaa4ae598c.js.LICENSE.txt
Normal 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
BIN
public/js/vendor.js
vendored
Binary file not shown.
Binary file not shown.
|
@ -1095,11 +1095,12 @@ export default {
|
|||
},
|
||||
|
||||
defineErrorMessage(errObject) {
|
||||
let msg;
|
||||
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 {
|
||||
let msg = errObject.message;
|
||||
msg = errObject.message;
|
||||
}
|
||||
return swal('Oops, something went wrong!', msg, 'error');
|
||||
},
|
||||
|
@ -1765,57 +1766,91 @@ export default {
|
|||
|
||||
applyFilterToMedia() {
|
||||
// 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;
|
||||
if(count) {
|
||||
this.page = 'filteringMedia';
|
||||
this.filteringRemainingCount = count;
|
||||
this.$nextTick(() => {
|
||||
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 {
|
||||
this.page = 3;
|
||||
}
|
||||
},
|
||||
|
||||
applyFilterToMediaSave(media, idx) {
|
||||
async applyFilterToMediaSave(media) {
|
||||
if(!media.filter_class) {
|
||||
return;
|
||||
}
|
||||
|
||||
let self = this;
|
||||
let data = null;
|
||||
const canvas = document.createElement('canvas');
|
||||
const ctx = canvas.getContext('2d');
|
||||
let image = document.createElement('img');
|
||||
// Load image
|
||||
const image = document.createElement('img');
|
||||
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.height = image.height;
|
||||
ctx.filter = App.util.filterCss[media.filter_class];
|
||||
ctx.drawImage(image, 0, 0, image.width, image.height);
|
||||
ctx.save();
|
||||
canvas.toBlob(function(blob) {
|
||||
data = new FormData();
|
||||
data.append('file', blob);
|
||||
data.append('id', media.id);
|
||||
axios.post('/api/compose/v0/media/update', data)
|
||||
.then(res => {
|
||||
self.media[idx].is_filtered = true;
|
||||
self.updateFilteringMedia();
|
||||
}).catch(err => {
|
||||
});
|
||||
}
|
||||
|
||||
// Draw image with filter to canvas
|
||||
const ctx = canvas.getContext('2d');
|
||||
if (!ctx) {
|
||||
throw new Error('Failed to get canvas context');
|
||||
}
|
||||
if (!('filter' in ctx)) {
|
||||
throw new Error('Canvas filter not supported');
|
||||
}
|
||||
ctx.filter = App.util.filterCss[media.filter_class];
|
||||
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);
|
||||
ctx.clearRect(0, 0, image.width, image.height);
|
||||
} else {
|
||||
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() {
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
<p class="text-center font-weight-bold">How to get your export data from Instagram:</p>
|
||||
<ol class="pb-4">
|
||||
<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 class="mb-2">
|
||||
<span>Wait for the email from Instagram with your download link</span>
|
||||
|
|
Loading…
Reference in a new issue