diff --git a/.config/example.yml b/.config/example.yml
index 29f4a62290..f19693cdb7 100644
--- a/.config/example.yml
+++ b/.config/example.yml
@@ -185,6 +185,10 @@ id: 'aid'
# connnectOverProxy: false
# setPublicReadOnUpload: true
# s3ForcePathStyle: true
+#gifbox:
+# managed: true
+# authKey: ''
+#
# !!!!!!!!!!
# >>>>>> AGAIN, NORMAL SELF-HOSTERS, STAY AWAY! <<<<<<
diff --git a/package.json b/package.json
index 8ab92436c6..9dcad8161e 100644
--- a/package.json
+++ b/package.json
@@ -45,6 +45,7 @@
"calckey-js": "^0.0.20",
"eslint": "^8.31.0",
"execa": "5.1.1",
+ "gifbox.js": "^0.9.0",
"gulp": "4.0.2",
"gulp-cssnano": "2.1.3",
"gulp-rename": "2.0.0",
diff --git a/packages/backend/migration/1672854439804-Gifbox.js b/packages/backend/migration/1672854439804-Gifbox.js
new file mode 100644
index 0000000000..10acf70e6a
--- /dev/null
+++ b/packages/backend/migration/1672854439804-Gifbox.js
@@ -0,0 +1,11 @@
+export class gifboxIntegration1672854439804 {
+ constructor() {
+ this.name = 'gifboxIntegration1672854439804';
+ }
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" ADD "deeplAuthKey" character varying(128)`);
+ }
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "deeplAuthKey"`);
+ }
+}
diff --git a/packages/backend/src/config/types.ts b/packages/backend/src/config/types.ts
index 9872b0eeb3..45bb200812 100644
--- a/packages/backend/src/config/types.ts
+++ b/packages/backend/src/config/types.ts
@@ -97,6 +97,10 @@ export type Source = {
setPublicReadOnUpload?: boolean;
s3ForcePathStyle?: boolean;
};
+ gifbox: {
+ managed?: boolean;
+ authKey?: string;
+ };
summalyProxyUrl?: string;
};
diff --git a/packages/backend/src/models/entities/meta.ts b/packages/backend/src/models/entities/meta.ts
index c24936c034..c5fa98b594 100644
--- a/packages/backend/src/models/entities/meta.ts
+++ b/packages/backend/src/models/entities/meta.ts
@@ -381,6 +381,12 @@ export class Meta {
})
public deeplIsPro: boolean;
+ @Column('varchar', {
+ length: 128,
+ nullable: true,
+ })
+ public gifboxAuthKey: string | null;
+
@Column('varchar', {
length: 512,
nullable: true,
diff --git a/packages/backend/src/server/api/endpoints/admin/accounts/hosted.ts b/packages/backend/src/server/api/endpoints/admin/accounts/hosted.ts
index 07cd984b07..1c417708a1 100644
--- a/packages/backend/src/server/api/endpoints/admin/accounts/hosted.ts
+++ b/packages/backend/src/server/api/endpoints/admin/accounts/hosted.ts
@@ -91,6 +91,9 @@ export default define(meta, paramDef, async (ps, me) => {
if (config.summalyProxyUrl !== undefined) {
set.summalyProxy = config.summalyProxyUrl;
}
+ if (config.gifbox.managed != null && config.gifbox.managed === true) {
+ set.gifboxAuthKey = config.gifbox.authKey;
+ }
await db.transaction(async transactionalEntityManager => {
const metas = await transactionalEntityManager.find(Meta, {
order: {
diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts
index 71a217d935..c49579f636 100644
--- a/packages/backend/src/server/api/endpoints/admin/meta.ts
+++ b/packages/backend/src/server/api/endpoints/admin/meta.ts
@@ -422,6 +422,7 @@ export default define(meta, paramDef, async (ps, me) => {
enableDiscordIntegration: instance.enableDiscordIntegration,
enableServiceWorker: instance.enableServiceWorker,
translatorAvailable: instance.deeplAuthKey != null,
+ gifboxAvailable: instance.gifboxAuthKey != null,
pinnedPages: instance.pinnedPages,
pinnedClipId: instance.pinnedClipId,
cacheRemoteFiles: instance.cacheRemoteFiles,
@@ -471,6 +472,7 @@ export default define(meta, paramDef, async (ps, me) => {
objectStorageS3ForcePathStyle: instance.objectStorageS3ForcePathStyle,
deeplAuthKey: instance.deeplAuthKey,
deeplIsPro: instance.deeplIsPro,
+ gifboxAuthKey: instance.gifboxAuthKey,
enableIpLogging: instance.enableIpLogging,
enableActiveEmailValidation: instance.enableActiveEmailValidation,
};
diff --git a/packages/backend/src/server/api/endpoints/admin/update-meta.ts b/packages/backend/src/server/api/endpoints/admin/update-meta.ts
index 61a1338f2f..7539f99fc4 100644
--- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts
+++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts
@@ -80,6 +80,7 @@ export const paramDef = {
summalyProxy: { type: 'string', nullable: true },
deeplAuthKey: { type: 'string', nullable: true },
deeplIsPro: { type: 'boolean' },
+ gifboxAuthKey: { type: 'string', nullable: true },
enableTwitterIntegration: { type: 'boolean' },
twitterConsumerKey: { type: 'string', nullable: true },
twitterConsumerSecret: { type: 'string', nullable: true },
@@ -465,6 +466,14 @@ export default define(meta, paramDef, async (ps, me) => {
set.deeplIsPro = ps.deeplIsPro;
}
+ if (ps.gifboxAuthKey !== undefined) {
+ if (ps.gifboxAuthKey === '') {
+ set.gifboxAuthKey = null;
+ } else {
+ set.gifboxAuthKey = ps.gifboxAuthKey;
+ }
+ }
+
if (ps.enableIpLogging !== undefined) {
set.enableIpLogging = ps.enableIpLogging;
}
diff --git a/packages/backend/src/server/api/endpoints/meta.ts b/packages/backend/src/server/api/endpoints/meta.ts
index f61236fa0b..ddf289ac5a 100644
--- a/packages/backend/src/server/api/endpoints/meta.ts
+++ b/packages/backend/src/server/api/endpoints/meta.ts
@@ -401,6 +401,7 @@ export default define(meta, paramDef, async (ps, me) => {
enableServiceWorker: instance.enableServiceWorker,
translatorAvailable: instance.deeplAuthKey != null,
+ gifboxAvailable: instance.gifboxAuthKey != null,
...(ps.detail ? {
pinnedPages: instance.privateMode && !me ? [] : instance.pinnedPages,
diff --git a/packages/client/src/pages/admin/settings.vue b/packages/client/src/pages/admin/settings.vue
index 1715908130..dc64f1ed37 100644
--- a/packages/client/src/pages/admin/settings.vue
+++ b/packages/client/src/pages/admin/settings.vue
@@ -167,6 +167,15 @@
Pro account
+
+
+ GifBox integration
+
+
+
+ GifBox Auth Key
+
+
@@ -217,6 +226,7 @@ let swPublicKey: any = $ref(null);
let swPrivateKey: any = $ref(null);
let deeplAuthKey: string = $ref('');
let deeplIsPro: boolean = $ref(false);
+let gifboxAuthKey: string = $ref('');
async function init() {
const meta = await os.api('admin/meta');
@@ -249,6 +259,7 @@ async function init() {
swPrivateKey = meta.swPrivateKey;
deeplAuthKey = meta.deeplAuthKey;
deeplIsPro = meta.deeplIsPro;
+ gifboxAuthKey = meta.gifboxAuthKey;
}
function save() {
@@ -282,6 +293,7 @@ function save() {
swPrivateKey,
deeplAuthKey,
deeplIsPro,
+ gifboxAuthKey,
}).then(() => {
fetchInstance();
});
diff --git a/yarn.lock b/yarn.lock
index 7020edd7d7..a504f3a544 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3840,6 +3840,7 @@ __metadata:
cypress: 10.11.0
eslint: ^8.31.0
execa: 5.1.1
+ gifbox.js: ^0.9.0
gulp: 4.0.2
gulp-cssnano: 2.1.3
gulp-rename: 2.0.0
@@ -7395,6 +7396,16 @@ __metadata:
languageName: node
linkType: hard
+"gifbox.js@npm:^0.9.0":
+ version: 0.9.0
+ resolution: "gifbox.js@npm:0.9.0"
+ dependencies:
+ axios: ^0.24.0
+ form-data: ^4.0.0
+ checksum: 0e13566249c1f3ee366ca32e451c7926b50658190da3f15f5e0dc7e094167bc1c43621142245b1dbf16b5008a26996bc36799d3c81f78c5418541fe9eaa24892
+ languageName: node
+ linkType: hard
+
"github-from-package@npm:0.0.0":
version: 0.0.0
resolution: "github-from-package@npm:0.0.0"