diff --git a/api/src/routes/gifs/search.ts b/api/src/routes/gifs/search.ts
index 3cbff64f..45b3ddca 100644
--- a/api/src/routes/gifs/search.ts
+++ b/api/src/routes/gifs/search.ts
@@ -1,37 +1,24 @@
import { Router, Response, Request } from "express";
import fetch from "node-fetch";
import { route } from "@fosscord/api";
+import { getGifApiKey, parseGifResult } from "./trending";
const router = Router();
router.get("/", route({}), async (req: Request, res: Response) => {
- // TODO: Custom providers and code quality
- const { q, media_format, locale, provider } = req.query;
+ // TODO: Custom providers
+ const { q, media_format, locale } = req.query;
- const parseResult = (result: any) => {
- return {
- id: result.id,
- title: result.title,
- url: result.itemurl,
- src: result.media[0].mp4.url,
- gif_src: result.media[0].gif.url,
- width: result.media[0].mp4.dims[0],
- height: result.media[0].mp4.dims[1],
- preview: result.media[0].mp4.preview
- };
- };
+ const apiKey = getGifApiKey();
- const response = await fetch(`https://g.tenor.com/v1/search?q=${q}&media_format=${media_format}&locale=${locale}&key=LIVDSRZULELA`, {
+ const response = await fetch(`https://g.tenor.com/v1/search?q=${q}&media_format=${media_format}&locale=${locale}&key=${apiKey}`, {
method: "get",
headers: { "Content-Type": "application/json" }
});
const { results } = await response.json();
- let cache = new Array() as any[];
- results.forEach((result: any) => {
- cache.push(parseResult(result));
- });
- res.json(cache).status(200);
+
+ res.json(results.map(parseGifResult)).status(200);
});
export default router;
diff --git a/api/src/routes/gifs/trending-gifs.ts b/api/src/routes/gifs/trending-gifs.ts
index 76e791fa..b5f87222 100644
--- a/api/src/routes/gifs/trending-gifs.ts
+++ b/api/src/routes/gifs/trending-gifs.ts
@@ -1,37 +1,24 @@
import { Router, Response, Request } from "express";
import fetch from "node-fetch";
import { route } from "@fosscord/api";
+import { getGifApiKey, parseGifResult } from "./trending";
const router = Router();
router.get("/", route({}), async (req: Request, res: Response) => {
- // TODO: Custom providers and code quality
- const { media_format, locale, provider } = req.query;
+ // TODO: Custom providers
+ const { media_format, locale } = req.query;
- const parseResult = (result: any) => {
- return {
- id: result.id,
- title: result.title,
- url: result.itemurl,
- src: result.media[0].mp4.url,
- gif_src: result.media[0].gif.url,
- width: result.media[0].mp4.dims[0],
- height: result.media[0].mp4.dims[1],
- preview: result.media[0].mp4.preview
- };
- };
+ const apiKey = getGifApiKey();
- const response = await fetch(`https://g.tenor.com/v1/trending?media_format=${media_format}&locale=${locale}&key=LIVDSRZULELA`, {
+ const response = await fetch(`https://g.tenor.com/v1/trending?media_format=${media_format}&locale=${locale}&key=${apiKey}`, {
method: "get",
headers: { "Content-Type": "application/json" }
});
const { results } = await response.json();
- let cache = new Array() as any[];
- results.forEach((result: any) => {
- cache.push(parseResult(result));
- });
- res.json(cache).status(200);
+
+ res.json(results.map(parseGifResult)).status(200);
});
export default router;
diff --git a/api/src/routes/gifs/trending.ts b/api/src/routes/gifs/trending.ts
index 3b91eb12..7ee9337e 100644
--- a/api/src/routes/gifs/trending.ts
+++ b/api/src/routes/gifs/trending.ts
@@ -1,48 +1,57 @@
import { Router, Response, Request } from "express";
import fetch from "node-fetch";
import { route } from "@fosscord/api";
+import { Config } from "@fosscord/util";
+import { HTTPError } from "lambert-server";
const router = Router();
-router.get("/", route({}), async (req: Request, res: Response) => {
- // TODO: Custom providers and code quality
- const { media_format, locale, provider } = req.query;
-
- const parseResult = (result: any) => {
- return {
- id: result.id,
- title: result.title,
- url: result.itemurl,
- src: result.media[0].mp4.url,
- gif_src: result.media[0].gif.url,
- width: result.media[0].mp4.dims[0],
- height: result.media[0].mp4.dims[1],
- preview: result.media[0].mp4.preview
- };
+export function parseGifResult(result: any) {
+ return {
+ id: result.id,
+ title: result.title,
+ url: result.itemurl,
+ src: result.media[0].mp4.url,
+ gif_src: result.media[0].gif.url,
+ width: result.media[0].mp4.dims[0],
+ height: result.media[0].mp4.dims[1],
+ preview: result.media[0].mp4.preview
};
+}
+
+export function getGifApiKey() {
+ const { enabled, provider, apiKey } = Config.get().gif;
+ if (!enabled) throw new HTTPError(`Gifs are disabled`);
+ if (provider !== "tenor" || !apiKey) throw new HTTPError(`${provider} gif provider not supported`);
- const responseSource = await fetch(`https://g.tenor.com/v1/categories?media_format=${media_format}&locale=${locale}&key=LIVDSRZULELA`, {
- method: "get",
- headers: { "Content-Type": "application/json" }
- });
+ return apiKey;
+}
- const trendGifSource = await fetch(`https://g.tenor.com/v1/trending?media_format=${media_format}&locale=${locale}&key=LIVDSRZULELA`, {
- method: "get",
- headers: { "Content-Type": "application/json" }
- });
+router.get("/", route({}), async (req: Request, res: Response) => {
+ // TODO: Custom providers
+ // TODO: return gifs as mp4
+ const { media_format, locale } = req.query;
+
+ const apiKey = getGifApiKey();
+
+ const [responseSource, trendGifSource] = await Promise.all([
+ fetch(`https://g.tenor.com/v1/categories?locale=${locale}&key=${apiKey}`, {
+ method: "get",
+ headers: { "Content-Type": "application/json" }
+ }),
+ fetch(`https://g.tenor.com/v1/trending?locale=${locale}&key=${apiKey}`, {
+ method: "get",
+ headers: { "Content-Type": "application/json" }
+ })
+ ]);
const { tags } = await responseSource.json();
const { results } = await trendGifSource.json();
- let cache = new Array() as any[];
-
- tags.forEach((result: any) => {
- cache.push({
- name: result.searchterm,
- src: result.image
- });
- });
- res.json({ categories: [cache], gifs: [parseResult(results[0])] }).status(200);
+ res.json({
+ categories: tags.map((x: any) => ({ name: x.searchterm, src: x.image })),
+ gifs: [parseGifResult(results[0])]
+ }).status(200);
});
export default router;
diff --git a/api/src/util/Message.ts b/api/src/util/Message.ts
index f8230124..40d96b42 100644
--- a/api/src/util/Message.ts
+++ b/api/src/util/Message.ts
@@ -25,6 +25,7 @@ import cheerio from "cheerio";
import { MessageCreateSchema } from "../routes/channels/#channel_id/messages";
// TODO: check webhook, application, system author
+// TODO: embed gifs/videos/images
const LINK_REGEX = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/g;
|