mirror of
https://github.com/hansputera/tiktok-dl.git
synced 2026-04-05 19:51:57 +02:00
chore(apps.web): add prettier to apps/web
Signed-off-by: hansputera <hanifdwyputrasembiring@gmail.com>
This commit is contained in:
@@ -1,8 +1,6 @@
|
||||
const eslintConfigs = require('tiktok-dl-config/eslint.typescript');
|
||||
const eslintConfigs = require("tiktok-dl-config/eslint.typescript");
|
||||
|
||||
module.exports = {
|
||||
...eslintConfigs,
|
||||
extends: eslintConfigs.extends.concat([
|
||||
'plugin:@next/next/recommended',
|
||||
])
|
||||
...eslintConfigs,
|
||||
extends: eslintConfigs.extends.concat(["plugin:@next/next/recommended"]),
|
||||
};
|
||||
|
||||
3
apps/web/.prettierignore
Normal file
3
apps/web/.prettierignore
Normal file
@@ -0,0 +1,3 @@
|
||||
*.json
|
||||
.next
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
export const rateLimitConfig = {
|
||||
'enable': true, // you can set it to 'false'
|
||||
enable: true, // you can set it to 'false'
|
||||
/**
|
||||
* How much rate limit count per x second(s)
|
||||
* -is allowed? Default: 60 requests
|
||||
*/
|
||||
'maxRatelimitPerXSeconds': 60,
|
||||
* How much rate limit count per x second(s)
|
||||
* -is allowed? Default: 60 requests
|
||||
*/
|
||||
maxRatelimitPerXSeconds: 60,
|
||||
/**
|
||||
* Every x second(s), the ratelimit data will removed.
|
||||
* So, their ratelimit data will removed.
|
||||
* PS: Data stored on redis.
|
||||
*/
|
||||
'ratelimitTime': 60,
|
||||
* Every x second(s), the ratelimit data will removed.
|
||||
* So, their ratelimit data will removed.
|
||||
* PS: Data stored on redis.
|
||||
*/
|
||||
ratelimitTime: 60,
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
export * from './redis';
|
||||
export * from './rotator';
|
||||
export * from "./redis";
|
||||
export * from "./rotator";
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
import Redis from 'ioredis';
|
||||
import Redis from "ioredis";
|
||||
|
||||
export const client = new Redis(process.env.REDIS_URL);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import {providerCache} from '../config';
|
||||
import {BaseProvider, ExtractedInfo, getRandomProvider} from 'tiktok-dl-core';
|
||||
import {client as redisClient} from './redis';
|
||||
import { providerCache } from "../config";
|
||||
import { BaseProvider, ExtractedInfo, getRandomProvider } from "tiktok-dl-core";
|
||||
import { client as redisClient } from "./redis";
|
||||
|
||||
/**
|
||||
* Rotate provider.
|
||||
@@ -10,11 +10,12 @@ import {client as redisClient} from './redis';
|
||||
* @return {Promise<ExtractedInfo>}
|
||||
*/
|
||||
export const rotateProvider = async (
|
||||
provider: BaseProvider, url: string,
|
||||
skipOnError: boolean = true):
|
||||
Promise<ExtractedInfo & { provider: string; }> => {
|
||||
// await redisClient.del(url);
|
||||
// console.log(provider.resourceName());
|
||||
provider: BaseProvider,
|
||||
url: string,
|
||||
skipOnError: boolean = true
|
||||
): Promise<ExtractedInfo & { provider: string }> => {
|
||||
// await redisClient.del(url);
|
||||
// console.log(provider.resourceName());
|
||||
if (provider.maintenance) {
|
||||
return await rotateProvider(getRandomProvider(), url, skipOnError);
|
||||
}
|
||||
@@ -28,11 +29,13 @@ export const rotateProvider = async (
|
||||
} else if (data.video && !data.video.urls.length) {
|
||||
return await rotateProvider(getRandomProvider(), url);
|
||||
} else {
|
||||
redisClient.set(url,
|
||||
JSON.stringify(
|
||||
{...data, provider: provider.resourceName()}), 'ex',
|
||||
providerCache);
|
||||
return {...data, provider: provider.resourceName()};
|
||||
redisClient.set(
|
||||
url,
|
||||
JSON.stringify({ ...data, provider: provider.resourceName() }),
|
||||
"ex",
|
||||
providerCache
|
||||
);
|
||||
return { ...data, provider: provider.resourceName() };
|
||||
}
|
||||
} catch (e) {
|
||||
if (skipOnError) {
|
||||
|
||||
@@ -1,26 +1,31 @@
|
||||
import type { NextApiRequest, NextApiResponse } from 'next';
|
||||
import {rateLimitConfig} from '../config';
|
||||
import {client} from '../lib';
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
import { rateLimitConfig } from "../config";
|
||||
import { client } from "../lib";
|
||||
|
||||
export const ratelimitMiddleware = async (req: NextApiRequest, res: NextApiResponse) => {
|
||||
const ip = req.headers['x-real-ip'] ||
|
||||
req.headers['x-forwarded-for'];
|
||||
if (!rateLimitConfig.enable || process.env.NODE_ENV === 'development') return true;
|
||||
else if (!ip) {
|
||||
return res.status(401).json({ 'message': 'Couldn\'t find your real ip address.' });
|
||||
}
|
||||
client.get('rate-' + ip, (_, result) => {
|
||||
if (result) {
|
||||
if (parseInt(result) > rateLimitConfig.maxRatelimitPerXSeconds) {
|
||||
return res.status(429).json({
|
||||
'message': 'Please try again, you are getting ratelimit!'
|
||||
});
|
||||
};
|
||||
client.incr('rate-' + ip);
|
||||
return true;
|
||||
} else {
|
||||
client.set('rate-' + ip, '1', 'ex', rateLimitConfig.ratelimitTime);
|
||||
return true;
|
||||
export const ratelimitMiddleware = async (
|
||||
req: NextApiRequest,
|
||||
res: NextApiResponse
|
||||
) => {
|
||||
const ip = req.headers["x-real-ip"] || req.headers["x-forwarded-for"];
|
||||
if (!rateLimitConfig.enable || process.env.NODE_ENV === "development")
|
||||
return true;
|
||||
else if (!ip) {
|
||||
return res
|
||||
.status(401)
|
||||
.json({ message: "Couldn't find your real ip address." });
|
||||
}
|
||||
client.get("rate-" + ip, (_, result) => {
|
||||
if (result) {
|
||||
if (parseInt(result) > rateLimitConfig.maxRatelimitPerXSeconds) {
|
||||
return res.status(429).json({
|
||||
message: "Please try again, you are getting ratelimit!",
|
||||
});
|
||||
}
|
||||
});
|
||||
client.incr("rate-" + ip);
|
||||
return true;
|
||||
} else {
|
||||
client.set("rate-" + ip, "1", "ex", rateLimitConfig.ratelimitTime);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1,18 +1,16 @@
|
||||
const webpack = require('webpack');
|
||||
const withTM = require('next-transpile-modules')(['tiktok-dl-core']);
|
||||
const webpack = require("webpack");
|
||||
const withTM = require("next-transpile-modules")(["tiktok-dl-core"]);
|
||||
|
||||
const { parsed: cusEnv } = require('dotenv').config({
|
||||
path: require('path').resolve(__dirname, '..', '..', '.env'),
|
||||
const { parsed: cusEnv } = require("dotenv").config({
|
||||
path: require("path").resolve(__dirname, "..", "..", ".env"),
|
||||
});
|
||||
|
||||
module.exports = withTM({
|
||||
reactStrictMode: true,
|
||||
webpack(config) {
|
||||
if (typeof cusEnv !== 'undefined') {
|
||||
config.plugins.push(
|
||||
new webpack.EnvironmentPlugin(cusEnv)
|
||||
);
|
||||
}
|
||||
return config;
|
||||
}
|
||||
reactStrictMode: true,
|
||||
webpack(config) {
|
||||
if (typeof cusEnv !== "undefined") {
|
||||
config.plugins.push(new webpack.EnvironmentPlugin(cusEnv));
|
||||
}
|
||||
return config;
|
||||
},
|
||||
});
|
||||
|
||||
@@ -15,13 +15,15 @@
|
||||
"scripts": {
|
||||
"build": "next build",
|
||||
"dev": "next dev",
|
||||
"lint": "next lint"
|
||||
"lint": "next lint",
|
||||
"format": "prettier . --write"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@next/eslint-plugin-next": "^12.0.10",
|
||||
"@types/ioredis": "^4.28.7",
|
||||
"@types/react": "^17.0.39",
|
||||
"next-transpile-modules": "^9.0.0",
|
||||
"prettier": "^2.5.1",
|
||||
"tiktok-dl-config": "*",
|
||||
"typescript": "latest"
|
||||
}
|
||||
|
||||
@@ -1,49 +1,52 @@
|
||||
import type {NextApiRequest, NextApiResponse} from 'next';
|
||||
import ow from 'ow';
|
||||
import {getProvider, Providers, BaseProvider} from 'tiktok-dl-core';
|
||||
import {rotateProvider} from '../../lib/rotator';
|
||||
import {ratelimitMiddleware} from '../../middleware/ratelimit';
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
import ow from "ow";
|
||||
import { getProvider, Providers, BaseProvider } from "tiktok-dl-core";
|
||||
import { rotateProvider } from "../../lib/rotator";
|
||||
import { ratelimitMiddleware } from "../../middleware/ratelimit";
|
||||
|
||||
export default async (req: NextApiRequest, res: NextApiResponse) => {
|
||||
try {
|
||||
const continueOrNah = await ratelimitMiddleware(req, res);
|
||||
if (typeof continueOrNah !== 'boolean') return;
|
||||
if (typeof continueOrNah !== "boolean") return;
|
||||
const providersType = Providers.map((p) => p.resourceName());
|
||||
ow(req.body || req.query, ow.object.partialShape({
|
||||
'url': ow.string.url.validate((v) => ({
|
||||
'validator': /^http(s?)(:\/\/)([a-z]+\.)*tiktok\.com\/(.*)$/gi
|
||||
.test(v),
|
||||
'message': 'Expected (.*).tiktok.com',
|
||||
})),
|
||||
'type': ow.optional.string.validate((v) => ({
|
||||
'validator': typeof v === 'string' &&
|
||||
providersType.includes(v.toLowerCase()),
|
||||
'message': 'Invalid Provider, available provider is: ' +
|
||||
Providers.map((x) => x.resourceName()).join(', '),
|
||||
})),
|
||||
'nocache': req.method === 'POST' ?
|
||||
ow.optional.boolean : ow.optional.string,
|
||||
'rotateOnError': req.method === 'POST' ?
|
||||
ow.optional.boolean : ow.optional.string,
|
||||
}));
|
||||
ow(
|
||||
req.body || req.query,
|
||||
ow.object.partialShape({
|
||||
url: ow.string.url.validate((v) => ({
|
||||
validator: /^http(s?)(:\/\/)([a-z]+\.)*tiktok\.com\/(.*)$/gi.test(v),
|
||||
message: "Expected (.*).tiktok.com",
|
||||
})),
|
||||
type: ow.optional.string.validate((v) => ({
|
||||
validator:
|
||||
typeof v === "string" && providersType.includes(v.toLowerCase()),
|
||||
message:
|
||||
"Invalid Provider, available provider is: " +
|
||||
Providers.map((x) => x.resourceName()).join(", "),
|
||||
})),
|
||||
nocache:
|
||||
req.method === "POST" ? ow.optional.boolean : ow.optional.string,
|
||||
rotateOnError:
|
||||
req.method === "POST" ? ow.optional.boolean : ow.optional.string,
|
||||
})
|
||||
);
|
||||
|
||||
const provider = getProvider((req.query.type || req.body.type) ?? 'random');
|
||||
const provider = getProvider((req.query.type || req.body.type) ?? "random");
|
||||
if (!provider) {
|
||||
return res.status(400).json({
|
||||
'error': 'Invalid provider',
|
||||
'providers': providersType,
|
||||
error: "Invalid provider",
|
||||
providers: providersType,
|
||||
});
|
||||
}
|
||||
const result = await rotateProvider(
|
||||
provider as BaseProvider, (req.query.url ||
|
||||
req.body.url), req.method === 'POST' ?
|
||||
req.body.rotateOnError :
|
||||
!!req.query.rotateOnError);
|
||||
provider as BaseProvider,
|
||||
req.query.url || req.body.url,
|
||||
req.method === "POST" ? req.body.rotateOnError : !!req.query.rotateOnError
|
||||
);
|
||||
|
||||
return res.status(200).json(result);
|
||||
} catch (e) {
|
||||
return res.status(500).json({
|
||||
'error': (e as Error).message,
|
||||
error: (e as Error).message,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import type {NextApiRequest, NextApiResponse} from 'next';
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
|
||||
export default async (_: NextApiRequest, res: NextApiResponse) => {
|
||||
res.send('Y');
|
||||
res.send("Y");
|
||||
};
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
import type {NextApiRequest, NextApiResponse} from 'next';
|
||||
import {Providers} from 'tiktok-dl-core';
|
||||
import {ratelimitMiddleware} from '../../middleware/ratelimit';
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
import { Providers } from "tiktok-dl-core";
|
||||
import { ratelimitMiddleware } from "../../middleware/ratelimit";
|
||||
|
||||
export default async (req: NextApiRequest, res: NextApiResponse) => {
|
||||
const continueOrNah = await ratelimitMiddleware(req, res);
|
||||
if (typeof continueOrNah !== 'boolean') return;
|
||||
if (typeof continueOrNah !== "boolean") return;
|
||||
|
||||
const providers = Providers.map((p) => ({
|
||||
'name': p.resourceName(),
|
||||
'url': p.client?.defaults.options.prefixUrl,
|
||||
'maintenance': p.maintenance,
|
||||
name: p.resourceName(),
|
||||
url: p.client?.defaults.options.prefixUrl,
|
||||
maintenance: p.maintenance,
|
||||
}));
|
||||
|
||||
return res.send(providers);
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import type {NextApiRequest, NextApiResponse} from 'next';
|
||||
import {client} from '../../lib';
|
||||
import {ratelimitMiddleware} from '../../middleware/ratelimit';
|
||||
import {matchLink} from 'tiktok-dl-core';
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
import { client } from "../../lib";
|
||||
import { ratelimitMiddleware } from "../../middleware/ratelimit";
|
||||
import { matchLink } from "tiktok-dl-core";
|
||||
|
||||
export default async (req: NextApiRequest, res: NextApiResponse) => {
|
||||
const continueOrNah = await ratelimitMiddleware(req, res);
|
||||
if (typeof continueOrNah !== 'boolean') return;
|
||||
const keys = await client.keys('*');
|
||||
if (typeof continueOrNah !== "boolean") return;
|
||||
const keys = await client.keys("*");
|
||||
res.status(200).json(keys.filter((x) => matchLink(x)));
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user