From 39ae930a0cddf05c795fcb44101db801ddc285f6 Mon Sep 17 00:00:00 2001 From: wukko Date: Tue, 13 Feb 2024 13:41:16 +0600 Subject: [PATCH] api: restructuring fresh start :) - removed all web stuff - removed localization from api - removed error.js - cleaned up module names - environment variables are now capitalized - copied favicon for api to assets folder --- api/README.md | 2 + api/config.json | 96 +------------------ api/core/config.js | 14 +-- api/core/endpoints.js | 15 ++- api/modules/processing/match.js | 19 ++-- api/modules/processing/matchActionDecider.js | 9 +- api/modules/processing/services/bilibili.js | 2 +- api/modules/processing/services/instagram.js | 2 +- api/modules/processing/services/ok.js | 4 +- api/modules/processing/services/pinterest.js | 2 +- api/modules/processing/services/reddit.js | 2 +- api/modules/processing/services/rutube.js | 4 +- api/modules/processing/services/soundcloud.js | 4 +- api/modules/processing/services/tiktok.js | 2 +- api/modules/processing/services/tumblr.js | 2 +- api/modules/processing/services/twitch.js | 4 +- api/modules/processing/services/twitter.js | 2 +- api/modules/processing/services/vimeo.js | 4 +- api/modules/processing/services/vk.js | 4 +- api/modules/processing/services/youtube.js | 4 +- api/modules/processing/url.js | 2 +- api/modules/stream/manage.js | 4 +- api/modules/stream/types.js | 4 +- api/modules/util/loadFromFs.js | 9 +- api/modules/util/preApi.js | 16 ++-- api/package.json | 12 +-- api/server.js | 25 ++--- 27 files changed, 77 insertions(+), 192 deletions(-) create mode 100644 api/README.md diff --git a/api/README.md b/api/README.md new file mode 100644 index 00000000..e9c8e8dd --- /dev/null +++ b/api/README.md @@ -0,0 +1,2 @@ +# cobalt api +(TODO) \ No newline at end of file diff --git a/api/config.json b/api/config.json index f1aa4a2a..1df0b278 100644 --- a/api/config.json +++ b/api/config.json @@ -2,90 +2,6 @@ "streamLifespan": 90000, "maxVideoDuration": 10800000, "genericUserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", - "authorInfo": { - "name": "wukko", - "link": "https://wukko.me/", - "contact": "https://wukko.me/contacts", - "support": { - "default": { - "email": { - "emoji": "πŸ“§", - "url": "mailto:support@cobalt.tools", - "name": "support@cobalt.tools" - }, - "twitter": { - "emoji": "🐦", - "url": "https://twitter.com/justusecobalt", - "name": "@justusecobalt" - }, - "discord": { - "emoji": "πŸ‘Ύ", - "url": "https://discord.gg/pQPt8HBUPu", - "name": "cobalt discord server" - } - }, - "ru": { - "telegram": { - "emoji": "πŸ“¬", - "url": "https://t.me/justusecobalt_ru", - "name": "ΠΊΠ°Π½Π°Π» Π² telegram" - }, - "email": { - "emoji": "πŸ“§", - "url": "mailto:support@cobalt.tools", - "name": "support@cobalt.tools" - } - } - } - }, - "donations": { - "crypto": { - "monero": "4B1SNB6s8Pq1hxjNeKPEe8Qa8EP3zdL16Sqsa7QDoJcUecKQzEj9BMxWnEnTGu12doKLJBKRDUqnn6V9qfSdXpXi3Nw5Uod", - "litecoin": "ltc1qvp0xhrk2m7pa6p6z844qcslfyxv4p3vf95rhna", - "ethereum": "0x4B4cF23051c78c7A7E0eA09d39099621c46bc302", - "usdt-erc20": "0x4B4cF23051c78c7A7E0eA09d39099621c46bc302", - "usdt-trc20": "TVbx7YT3rBfu931Gxko6pRfXtedYqbgnBB", - "bitcoin": "bc1qlvcnlnyzfsgnuxyxsv3k0p0q0yln0azjpadyx4", - "bitcoin-alt": "18PKf6N2cHrmSzz9ZzTSvDd2jAkqGC7SxA", - "ton": "UQA3SO-hHZq1oCCT--u6or6ollB8fd2o52aD8mXiLk9iDZd3" - }, - "links": { - "boosty": "https://boosty.to/wukko/donate" - } - }, - "links": { - "saveToGalleryShortcut": "https://www.icloud.com/shortcuts/14e9aebf04b24156acc34ceccf7e6fcd", - "saveToFilesShortcut": "https://www.icloud.com/shortcuts/2134cd9d4d6b41448b2201f933542b2e", - "statusPage": "https://status.cobalt.tools/", - "troubleshootingGuide": "https://github.com/wukko/cobalt/blob/current/docs/troubleshooting.md" - }, - "celebrations": { - "01-01": "πŸŽ„", - "02-17": "😺", - "02-22": "😺", - "03-01": "😺", - "03-08": "πŸ’ͺ", - "05-26": "πŸŽ‚", - "08-08": "😺", - "08-26": "🐢", - "10-29": "😺", - "10-30": "πŸŽƒ", - "10-31": "πŸŽƒ", - "11-01": "πŸ•―οΈ", - "11-02": "πŸ•―οΈ", - "12-20": "πŸŽ„", - "12-21": "πŸŽ„", - "12-22": "πŸŽ„", - "12-23": "πŸŽ„", - "12-24": "πŸŽ„", - "12-25": "πŸŽ„", - "12-26": "πŸŽ„", - "12-27": "πŸŽ„", - "12-28": "πŸŽ„", - "12-29": "πŸŽ„", - "12-30": "πŸŽ„", - "12-31": "πŸŽ„" - }, "supportedAudio": ["mp3", "ogg", "wav", "opus"], "ffmpegArgs": { "webm": ["-c:v", "copy", "-c:a", "copy"], @@ -94,15 +10,5 @@ "audio": ["-ar", "48000", "-ac", "2", "-b:a", "320k"], "m4a": ["-movflags", "frag_keyframe+empty_moov"], "gif": ["-vf", "scale=-1:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse", "-loop", "0"] - }, - "sponsors": [{ - "name": "royale", - "fullName": "RoyaleHosting", - "url": "https://royalehosting.net/", - "logo": { - "width": 605, - "height": 136, - "scale": 5 - } - }] + } } diff --git a/api/core/config.js b/api/core/config.js index 0c3904e9..536bfb19 100644 --- a/api/core/config.js +++ b/api/core/config.js @@ -1,9 +1,9 @@ import UrlPattern from "url-pattern"; import { loadJSON } from "../modules/util/loadFromFs.js"; -const config = loadJSON("./src/config.json"); -const packageJson = loadJSON("./package.json"); -const servicesConfigJson = loadJSON("./src/modules/processing/servicesConfig.json"); +const config = loadJSON("config.json"); +const packageJson = loadJSON("package.json"); +const servicesConfigJson = loadJSON("modules/processing/servicesConfig.json"); Object.values(servicesConfigJson.config).forEach(service => { service.patterns = service.patterns.map( @@ -20,11 +20,5 @@ export const streamLifespan = config.streamLifespan, maxVideoDuration = config.maxVideoDuration, genericUserAgent = config.genericUserAgent, - repo = packageJson["bugs"]["url"].replace('/issues', ''), - authorInfo = config.authorInfo, - donations = config.donations, ffmpegArgs = config.ffmpegArgs, - supportedAudio = config.supportedAudio, - celebrations = config.celebrations, - links = config.links, - sponsors = config.sponsors + supportedAudio = config.supportedAudio diff --git a/api/core/endpoints.js b/api/core/endpoints.js index b08f4e4b..cf234f38 100644 --- a/api/core/endpoints.js +++ b/api/core/endpoints.js @@ -9,8 +9,7 @@ import { getJSON } from "../modules/util/preApi.js"; import { apiJSON, checkJSONPost, getIP, languageCode } from "../modules/util/misc.js"; import { Bright, Cyan } from "../modules/util/consoleText.js"; import stream from "../modules/stream/stream.js"; -import loc from "../localization/manager.js"; -import { generateHmac } from "../modules/sub/crypto.js"; +import { generateHmac } from "../modules/util/crypto.js"; import { verifyStream } from "../modules/stream/manage.js"; export function runAPI(express, app, gitCommit, gitBranch, __dirname) { @@ -28,7 +27,7 @@ export function runAPI(express, app, gitCommit, gitBranch, __dirname) { handler: (req, res, next, opt) => { return res.status(429).json({ "status": "rate-limit", - "text": loc(languageCode(req), 'ErrorRateLimit') + "text": 'ErrorRateLimit' }); } }); @@ -41,7 +40,7 @@ export function runAPI(express, app, gitCommit, gitBranch, __dirname) { handler: (req, res, next, opt) => { return res.status(429).json({ "status": "rate-limit", - "text": loc(languageCode(req), 'ErrorRateLimit') + "text": 'ErrorRateLimit' }); } }); @@ -109,11 +108,11 @@ export function runAPI(express, app, gitCommit, gitBranch, __dirname) { j = await getJSON(chck.url, lang, chck); } else { j = apiJSON(0, { - t: !contentCon ? "invalid content type header" : loc(lang, 'ErrorNoLink') + t: !contentCon ? "invalid content type header" : 'ErrorNoLink' }); } } catch (e) { - j = apiJSON(0, { t: loc(lang, 'ErrorCantProcess') }); + j = apiJSON(0, { t: 'ErrorCantProcess' }); } return res.status(j.status).json(j.body); } catch (e) { @@ -166,7 +165,7 @@ export function runAPI(express, app, gitCommit, gitBranch, __dirname) { } catch (e) { return res.status(500).json({ status: "error", - text: loc(languageCode(req), 'ErrorCantProcess') + text: 'ErrorCantProcess' }); } }); @@ -176,7 +175,7 @@ export function runAPI(express, app, gitCommit, gitBranch, __dirname) { }); app.get('/favicon.ico', (req, res) => { - res.sendFile(`${__dirname}/src/front/icons/favicon.ico`) + res.sendFile(`${__dirname}/api/assets/favicon.ico`) }); app.get('/*', (req, res) => { diff --git a/api/modules/processing/match.js b/api/modules/processing/match.js index 6f715ef7..9bdea973 100644 --- a/api/modules/processing/match.js +++ b/api/modules/processing/match.js @@ -1,9 +1,6 @@ import { strict as assert } from "node:assert"; -import { apiJSON } from "../sub/utils.js"; -import { errorUnsupported, genericError, brokenLink } from "../sub/errors.js"; - -import loc from "../../localization/manager.js"; +import { apiJSON } from "../util/misc.js"; import { testers } from "./servicesPatternTesters.js"; import matchActionDecider from "./matchActionDecider.js"; @@ -32,8 +29,8 @@ export default async function(host, patternMatch, url, lang, obj) { try { let r, isAudioOnly = !!obj.isAudioOnly, disableMetadata = !!obj.disableMetadata; - if (!testers[host]) return apiJSON(0, { t: errorUnsupported(lang) }); - if (!(testers[host](patternMatch))) return apiJSON(0, { t: brokenLink(lang, host) }); + if (!testers[host]) return apiJSON(0, { t: 'ErrorUnsupported' }); + if (!(testers[host](patternMatch))) return apiJSON(0, { t: 'ErrorBrokenLink' }); switch (host) { case "twitter": @@ -159,20 +156,18 @@ export default async function(host, patternMatch, url, lang, obj) { r = await dailymotion(patternMatch); break; default: - return apiJSON(0, { t: errorUnsupported(lang) }); + return apiJSON(0, { t: 'ErrorUnsupported' }); } if (r.isAudioOnly) isAudioOnly = true; let isAudioMuted = isAudioOnly ? false : obj.isAudioMuted; if (r.error && r.critical) - return apiJSON(6, { t: loc(lang, r.error) }) + return apiJSON(6, { t: r.error }) if (r.error) return apiJSON(0, { - t: Array.isArray(r.error) - ? loc(lang, r.error[0], r.error[1]) - : loc(lang, r.error) + t: r.error }) return matchActionDecider( @@ -181,6 +176,6 @@ export default async function(host, patternMatch, url, lang, obj) { obj.filenamePattern, obj.twitterGif ) } catch (e) { - return apiJSON(0, { t: genericError(lang, host) }) + return apiJSON(0, { t: 'ErrorBadFetch' }) } } diff --git a/api/modules/processing/matchActionDecider.js b/api/modules/processing/matchActionDecider.js index 2d8840a3..85ad2f80 100644 --- a/api/modules/processing/matchActionDecider.js +++ b/api/modules/processing/matchActionDecider.js @@ -1,6 +1,5 @@ -import { audioIgnore, services, supportedAudio } from "../config.js"; -import { apiJSON } from "../sub/utils.js"; -import loc from "../../localization/manager.js"; +import { audioIgnore, services, supportedAudio } from "../../core/config.js"; +import { apiJSON } from "../util/misc.js"; import createFilename from "./createFilename.js"; export default function(r, host, userFormat, isAudioOnly, lang, isAudioMuted, disableMetadata, filenamePattern, toGif) { @@ -35,7 +34,7 @@ export default function(r, host, userFormat, isAudioOnly, lang, isAudioMuted, di switch (action) { default: - return apiJSON(0, { t: loc(lang, 'ErrorEmptyDownload') }); + return apiJSON(0, { t: 'ErrorEmptyDownload' }); case "photo": responseType = 1; @@ -127,7 +126,7 @@ export default function(r, host, userFormat, isAudioOnly, lang, isAudioMuted, di case "audio": if ((host === "reddit" && r.typeId === 1) || audioIgnore.includes(host)) { - return apiJSON(0, { t: loc(lang, 'ErrorEmptyDownload') }) + return apiJSON(0, { t: 'ErrorEmptyDownload' }) } let processType = "render", diff --git a/api/modules/processing/services/bilibili.js b/api/modules/processing/services/bilibili.js index 6da110bf..5700573b 100644 --- a/api/modules/processing/services/bilibili.js +++ b/api/modules/processing/services/bilibili.js @@ -1,4 +1,4 @@ -import { genericUserAgent, maxVideoDuration } from "../../config.js"; +import { genericUserAgent, maxVideoDuration } from "../../../core/config.js"; // TO-DO: higher quality downloads (currently requires an account) diff --git a/api/modules/processing/services/instagram.js b/api/modules/processing/services/instagram.js index c8f190a4..f021da37 100644 --- a/api/modules/processing/services/instagram.js +++ b/api/modules/processing/services/instagram.js @@ -1,5 +1,5 @@ import { createStream } from "../../stream/manage.js"; -import { genericUserAgent } from "../../config.js"; +import { genericUserAgent } from "../../../core/config.js"; import { getCookie, updateCookie } from "../cookie/manager.js"; const commonInstagramHeaders = { diff --git a/api/modules/processing/services/ok.js b/api/modules/processing/services/ok.js index bde163f6..ca4f7e3b 100644 --- a/api/modules/processing/services/ok.js +++ b/api/modules/processing/services/ok.js @@ -1,5 +1,5 @@ -import { genericUserAgent, maxVideoDuration } from "../../config.js"; -import { cleanString } from "../../sub/utils.js"; +import { genericUserAgent, maxVideoDuration } from "../../../core/config.js"; +import { cleanString } from "../../util/misc.js"; const resolutions = { "ultra": "2160", diff --git a/api/modules/processing/services/pinterest.js b/api/modules/processing/services/pinterest.js index 0f14eebf..4ea69f3f 100644 --- a/api/modules/processing/services/pinterest.js +++ b/api/modules/processing/services/pinterest.js @@ -1,4 +1,4 @@ -import { genericUserAgent } from "../../config.js"; +import { genericUserAgent } from "../../../core/config.js"; const videoLinkBase = { "regular": "https://v1.pinimg.com/videos/mc/720p/", diff --git a/api/modules/processing/services/reddit.js b/api/modules/processing/services/reddit.js index 8964b24f..b705ea63 100644 --- a/api/modules/processing/services/reddit.js +++ b/api/modules/processing/services/reddit.js @@ -1,4 +1,4 @@ -import { genericUserAgent, maxVideoDuration } from "../../config.js"; +import { genericUserAgent, maxVideoDuration } from "../../../core/config.js"; import { getCookie, updateCookieValues } from "../cookie/manager.js"; async function getAccessToken() { diff --git a/api/modules/processing/services/rutube.js b/api/modules/processing/services/rutube.js index af99a31d..5bb02b4e 100644 --- a/api/modules/processing/services/rutube.js +++ b/api/modules/processing/services/rutube.js @@ -1,6 +1,6 @@ import HLS from 'hls-parser'; -import { maxVideoDuration } from "../../config.js"; -import { cleanString } from '../../sub/utils.js'; +import { maxVideoDuration } from "../../../core/config.js"; +import { cleanString } from '../../util/misc.js'; export default async function(obj) { let quality = obj.quality === "max" ? "9000" : obj.quality; diff --git a/api/modules/processing/services/soundcloud.js b/api/modules/processing/services/soundcloud.js index 37baee54..d0e157a1 100644 --- a/api/modules/processing/services/soundcloud.js +++ b/api/modules/processing/services/soundcloud.js @@ -1,5 +1,5 @@ -import { maxVideoDuration } from "../../config.js"; -import { cleanString } from "../../sub/utils.js"; +import { maxVideoDuration } from "../../../core/config.js"; +import { cleanString } from "../../util/misc.js"; const cachedID = { version: '', diff --git a/api/modules/processing/services/tiktok.js b/api/modules/processing/services/tiktok.js index f3629109..17ac6c6f 100644 --- a/api/modules/processing/services/tiktok.js +++ b/api/modules/processing/services/tiktok.js @@ -1,4 +1,4 @@ -import { genericUserAgent } from "../../config.js"; +import { genericUserAgent } from "../../../core/config.js"; const shortDomain = "https://vt.tiktok.com/"; const apiPath = "https://api22-normal-c-alisg.tiktokv.com/aweme/v1/feed/?region=US&carrier_region=US"; diff --git a/api/modules/processing/services/tumblr.js b/api/modules/processing/services/tumblr.js index 05c7fd84..1918d125 100644 --- a/api/modules/processing/services/tumblr.js +++ b/api/modules/processing/services/tumblr.js @@ -1,5 +1,5 @@ import psl from "psl"; -import { genericUserAgent } from "../../config.js"; +import { genericUserAgent } from "../../../core/config.js"; const API_KEY = 'jrsCWX1XDuVxAFO4GkK147syAoN8BJZ5voz8tS80bPcj26Vc5Z'; const API_BASE = 'https://api-http2.tumblr.com'; diff --git a/api/modules/processing/services/twitch.js b/api/modules/processing/services/twitch.js index a23f0139..4b2e2d82 100644 --- a/api/modules/processing/services/twitch.js +++ b/api/modules/processing/services/twitch.js @@ -1,5 +1,5 @@ -import { maxVideoDuration } from "../../config.js"; -import { cleanString } from '../../sub/utils.js'; +import { maxVideoDuration } from "../../../core/config.js"; +import { cleanString } from '../../util/misc.js'; const gqlURL = "https://gql.twitch.tv/gql"; const clientIdHead = { "client-id": "kimne78kx3ncx6brgo4mv6wki5h1ko" }; diff --git a/api/modules/processing/services/twitter.js b/api/modules/processing/services/twitter.js index 94b55eb1..4d1c5228 100644 --- a/api/modules/processing/services/twitter.js +++ b/api/modules/processing/services/twitter.js @@ -1,4 +1,4 @@ -import { genericUserAgent } from "../../config.js"; +import { genericUserAgent } from "../../../core/config.js"; import { createStream } from "../../stream/manage.js"; const graphqlURL = 'https://twitter.com/i/api/graphql/5GOHgZe-8U2j5sVHQzEm9A/TweetResultByRestId'; diff --git a/api/modules/processing/services/vimeo.js b/api/modules/processing/services/vimeo.js index f51f7220..c3450909 100644 --- a/api/modules/processing/services/vimeo.js +++ b/api/modules/processing/services/vimeo.js @@ -1,5 +1,5 @@ -import { maxVideoDuration } from "../../config.js"; -import { cleanString } from '../../sub/utils.js'; +import { maxVideoDuration } from "../../../core/config.js"; +import { cleanString } from '../../util/misc.js'; const resolutionMatch = { "3840": "2160", diff --git a/api/modules/processing/services/vk.js b/api/modules/processing/services/vk.js index d956c3b9..7dedacb8 100644 --- a/api/modules/processing/services/vk.js +++ b/api/modules/processing/services/vk.js @@ -1,5 +1,5 @@ -import { genericUserAgent, maxVideoDuration } from "../../config.js"; -import { cleanString } from "../../sub/utils.js"; +import { genericUserAgent, maxVideoDuration } from "../../../core/config.js"; +import { cleanString } from "../../util/misc.js"; const resolutions = ["2160", "1440", "1080", "720", "480", "360", "240"]; diff --git a/api/modules/processing/services/youtube.js b/api/modules/processing/services/youtube.js index 10e813af..ff79467d 100644 --- a/api/modules/processing/services/youtube.js +++ b/api/modules/processing/services/youtube.js @@ -1,6 +1,6 @@ import { Innertube } from 'youtubei.js'; -import { maxVideoDuration } from '../../config.js'; -import { cleanString } from '../../sub/utils.js'; +import { maxVideoDuration } from '../../../core/config.js'; +import { cleanString } from '../../util/misc.js'; const yt = await Innertube.create(); diff --git a/api/modules/processing/url.js b/api/modules/processing/url.js index b272ff80..1d0aadf3 100644 --- a/api/modules/processing/url.js +++ b/api/modules/processing/url.js @@ -1,4 +1,4 @@ -import { services } from "../config.js"; +import { services } from "../../core/config.js"; import { strict as assert } from "node:assert"; import psl from "psl"; diff --git a/api/modules/stream/manage.js b/api/modules/stream/manage.js index d4cb1e68..bf37bb6f 100644 --- a/api/modules/stream/manage.js +++ b/api/modules/stream/manage.js @@ -2,8 +2,8 @@ import NodeCache from "node-cache"; import { randomBytes } from "crypto"; import { nanoid } from 'nanoid'; -import { decryptStream, encryptStream, generateHmac } from "../sub/crypto.js"; -import { streamLifespan } from "../config.js"; +import { decryptStream, encryptStream, generateHmac } from "../util/crypto.js"; +import { streamLifespan } from "../../core/config.js"; const streamNoAccess = { error: "i couldn't verify if you have access to this stream. go back and try again!", diff --git a/api/modules/stream/types.js b/api/modules/stream/types.js index 2b7d7482..707127c1 100644 --- a/api/modules/stream/types.js +++ b/api/modules/stream/types.js @@ -1,7 +1,7 @@ import { spawn } from "child_process"; import ffmpeg from "ffmpeg-static"; -import { ffmpegArgs, genericUserAgent } from "../config.js"; -import { metadataManager } from "../sub/utils.js"; +import { ffmpegArgs, genericUserAgent } from "../../core/config.js"; +import { metadataManager } from "../util/misc.js"; import { request } from "undici"; import { create as contentDisposition } from "content-disposition-header"; diff --git a/api/modules/util/loadFromFs.js b/api/modules/util/loadFromFs.js index 3cbb1614..813522b3 100644 --- a/api/modules/util/loadFromFs.js +++ b/api/modules/util/loadFromFs.js @@ -1,8 +1,15 @@ import * as fs from "fs"; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const splitDir = path.dirname(fileURLToPath(import.meta.url)).split('/'); +splitDir.splice(-2); +const dir = splitDir.join('/'); + export function loadJSON(path) { try { - return JSON.parse(fs.readFileSync(path, 'utf-8')) + return JSON.parse(fs.readFileSync(`${dir}/${path}`, 'utf-8')) } catch(e) { return false } diff --git a/api/modules/util/preApi.js b/api/modules/util/preApi.js index c3549bb3..57853a0f 100644 --- a/api/modules/util/preApi.js +++ b/api/modules/util/preApi.js @@ -1,17 +1,15 @@ -import { services } from "./config.js"; +import { services } from "../../core/config.js"; -import { apiJSON } from "./sub/utils.js"; -import { errorUnsupported } from "./sub/errors.js"; -import loc from "../localization/manager.js"; -import match from "./processing/match.js"; -import { getHostIfValid } from "./processing/url.js"; +import { apiJSON } from "./misc.js"; +import match from "../processing/match.js"; +import { getHostIfValid } from "../processing/url.js"; export async function getJSON(url, lang, obj) { try { const host = getHostIfValid(url); if (!host || !services[host].enabled) { - return apiJSON(0, { t: errorUnsupported(lang) }); + return apiJSON(0, { t: 'ErrorUnsupported' }); } let patternMatch; @@ -23,11 +21,11 @@ export async function getJSON(url, lang, obj) { } if (!patternMatch) { - return apiJSON(0, { t: errorUnsupported(lang) }); + return apiJSON(0, { t: 'ErrorUnsupported' }); } return await match(host, patternMatch, url, lang, obj) } catch (e) { - return apiJSON(0, { t: loc(lang, 'ErrorSomethingWentWrong') }) + return apiJSON(0, { t: 'ErrorSomethingWentWrong' }) } } diff --git a/api/package.json b/api/package.json index 3b0b3443..0932e283 100644 --- a/api/package.json +++ b/api/package.json @@ -1,19 +1,15 @@ { - "name": "cobalt", + "name": "cobalt_api", "description": "save what you love", - "version": "7.12.6", + "version": "8.0", "author": "wukko", - "exports": "./src/cobalt.js", + "exports": "./server.js", "type": "module", "engines": { "node": ">=18" }, "scripts": { - "start": "node src/cobalt", - "setup": "node src/modules/setup", - "test": "node src/test/test", - "build": "node src/modules/buildStatic", - "testFilenames": "node src/test/testFilenamePresets" + "start": "node server.js" }, "repository": { "type": "git", diff --git a/api/server.js b/api/server.js index 050aec46..d902cbf7 100644 --- a/api/server.js +++ b/api/server.js @@ -1,14 +1,14 @@ import "dotenv/config"; -import "./modules/sub/alias-envs.js"; +import "./modules/util/alias-envs.js"; import express from "express"; -import { Bright, Green, Red } from "./modules/sub/consoleText.js"; -import { getCurrentBranch, shortCommit } from "./modules/sub/currentCommit.js"; -import { loadLoc } from "./localization/manager.js"; - import path from 'path'; import { fileURLToPath } from 'url'; +import { runAPI } from "./core/endpoints.js"; + +import { Red } from "./modules/util/consoleText.js"; +import { getCurrentBranch, shortCommit } from "./modules/util/currentCommit.js"; const app = express(); @@ -20,21 +20,10 @@ const __dirname = path.dirname(__filename).slice(0, -4); app.disable('x-powered-by'); -await loadLoc(); - -const apiMode = process.env.API_URL && !process.env.WEB_URL; -const webMode = process.env.WEB_URL && process.env.API_URL; - -if (apiMode) { - const { runAPI } = await import('./core/api.js'); +if (process.env.API_URL) { runAPI(express, app, gitCommit, gitBranch, __dirname) -} else if (webMode) { - const { runWeb } = await import('./core/web.js'); - await runWeb(express, app, gitCommit, gitBranch, __dirname) } else { console.log( - Red(`cobalt wasn't configured yet or configuration is invalid.\n`) - + Bright(`please run the setup script to fix this: `) - + Green(`npm run setup`) + Red(`cobalt wasn't configured yet or configuration is invalid. check if API_URL is present in env\n`) ) }