Feature(custom): add support for sink

ISSUES CLOSED: #254
This commit is contained in:
Kuingsmile 2024-10-31 14:14:32 +08:00
parent a9eed2d4de
commit b843278b2c
9 changed files with 76 additions and 1 deletions

View File

@ -263,6 +263,8 @@ SETTINGS_SHORT_URL_C1N_TOKEN: C1N Token
SETTINGS_SHORT_URL_YOURLS_DOMAIN: YOURLS domain
SETTINGS_SHORT_URL_YOURLS_SIGNATURE: YOURLS signature
SETTINGS_SHORT_URL_CF_WORKER_HOST: Cloudflare Worker Host
SETTINGS_SHORT_SINK_DOMAIN: sink domain
SETTINGS_SHORT_SINK_TOKEN: sink token
SETTINGS_DELETE_LOCAL_FILE_AFTER_UPLOAD: Delete local file after upload
SETTINGS_SYNC_CONFIG: Settings Sync Configuration
SETTINGS_SYNC_CONFIG_TITLE: Sync Settings

View File

@ -266,6 +266,8 @@ SETTINGS_SHORT_URL_C1N_TOKEN: C1N Token
SETTINGS_SHORT_URL_YOURLS_DOMAIN: YOURLS域名
SETTINGS_SHORT_URL_YOURLS_SIGNATURE: YOURLS signature
SETTINGS_SHORT_URL_CF_WORKER_HOST: Cloudflare Worker域名
SETTINGS_SHORT_SINK_DOMAIN: sink域名
SETTINGS_SHORT_SINK_TOKEN: sink token
SETTINGS_DELETE_LOCAL_FILE_AFTER_UPLOAD: 上传后删除本地文件
SETTINGS_SYNC_CONFIG: 设置配置同步
SETTINGS_SYNC_CONFIG_TITLE: 同步设置

View File

@ -264,6 +264,8 @@ SETTINGS_SHORT_URL_C1N_TOKEN: C1N Token
SETTINGS_SHORT_URL_YOURLS_DOMAIN: YOURLS域名
SETTINGS_SHORT_URL_YOURLS_SIGNATURE: YOURLS signature
SETTINGS_SHORT_URL_CF_WORKER_HOST: Cloudflare Worker Host
SETTINGS_SHORT_SINK_DOMAIN: sink域名
SETTINGS_SHORT_SINK_TOKEN: sink token
SETTINGS_DELETE_LOCAL_FILE_AFTER_UPLOAD: 上傳後刪除本地檔案
SETTINGS_SYNC_CONFIG: 設置同步配置
SETTINGS_SYNC_CONFIG_TITLE: 同步設置

View File

@ -210,6 +210,34 @@ const generateCFWORKERShortUrl = async (url: string) => {
return url
}
const generateSinkShortUrl = async (url: string) => {
let sinkDomain = db.get(configPaths.settings.sinkDomain) || ''
const sinkToken = db.get(configPaths.settings.sinkToken) || ''
if (!sinkDomain || !sinkToken) {
logger.warn('Sink domain or token is not set')
return url
}
if (!/^https?:\/\//.test(sinkDomain)) {
sinkDomain = `http://${sinkDomain}`
}
if (sinkDomain.endsWith('/')) {
sinkDomain = sinkDomain.slice(0, -1)
}
try {
const res = await axios.post(
`${sinkDomain}/api/link/create`,
{ url },
{ headers: { Authorization: `Bearer ${sinkToken}` } }
)
if (res.data?.link?.slug) {
return `${sinkDomain}/${res.data.link.slug}`
}
} catch (e: any) {
logger.error(e)
}
return url
}
export const generateShortUrl = async (url: string) => {
const server = db.get(configPaths.settings.shortUrlServer) || IShortUrlServer.C1N
switch (server) {
@ -219,6 +247,8 @@ export const generateShortUrl = async (url: string) => {
return generateYOURLSShortUrl(url)
case IShortUrlServer.CFWORKER:
return generateCFWORKERShortUrl(url)
case IShortUrlServer.SINK:
return generateSinkShortUrl(url)
default:
return url
}

View File

@ -360,6 +360,28 @@
:placeholder="$T('SETTINGS_SHORT_URL_CF_WORKER_HOST')"
/>
</el-form-item>
<el-form-item
v-if="formOfSetting.useShortUrl && formOfSetting.shortUrlServer === 'sink'"
:label="$T('SETTINGS_SHORT_SINK_DOMAIN')"
>
<el-input
v-model="formOfSetting.sinkDomain"
size="small"
style="width: 50%"
:placeholder="$T('SETTINGS_SHORT_SINK_DOMAIN')"
/>
</el-form-item>
<el-form-item
v-if="formOfSetting.useShortUrl && formOfSetting.shortUrlServer === 'sink'"
:label="$T('SETTINGS_SHORT_SINK_TOKEN')"
>
<el-input
v-model="formOfSetting.sinkToken"
size="small"
style="width: 50%"
:placeholder="$T('SETTINGS_SHORT_SINK_TOKEN')"
/>
</el-form-item>
<el-form-item :label="$T('SETTINGS_ENCODE_OUTPUT_URL')">
<el-switch
v-model="formOfSetting.encodeOutputURL"
@ -976,6 +998,10 @@ const shortUrlServerList = [
{
label: 'xyTom/Url-Shorten-Worker',
value: 'cf_worker'
},
{
label: 'ccbikai/Sink',
value: 'sink'
}
]
@ -1050,6 +1076,8 @@ const formOfSetting = ref<ISettingForm>({
yourlsDomain: '',
yourlsSignature: '',
cfWorkerHost: '',
sinkDomain: '',
sinkToken: '',
deleteLocalFile: false,
serverKey: '',
aesPassword: 'PicList-aesPassword',
@ -1089,6 +1117,8 @@ const autoWatchKeys = [
'yourlsDomain',
'yourlsSignature',
'cfWorkerHost',
'sinkDomain',
'sinkToken',
'registry',
'proxy',
'autoCopy',

View File

@ -241,7 +241,8 @@ export enum II18nLanguage {
export enum IShortUrlServer {
C1N = 'c1n',
YOURLS = 'yourls',
CFWORKER = 'cf_worker'
CFWORKER = 'cf_worker',
SINK = 'sink'
}
export enum commonTaskStatus {

View File

@ -259,6 +259,8 @@ interface ILocales {
SETTINGS_SHORT_URL_YOURLS_DOMAIN: string
SETTINGS_SHORT_URL_YOURLS_SIGNATURE: string
SETTINGS_SHORT_URL_CF_WORKER_HOST: string
SETTINGS_SHORT_SINK_DOMAIN: string
SETTINGS_SHORT_SINK_TOKEN: string
SETTINGS_DELETE_LOCAL_FILE_AFTER_UPLOAD: string
SETTINGS_SYNC_CONFIG: string
SETTINGS_SYNC_CONFIG_TITLE: string

View File

@ -26,6 +26,8 @@ interface ISettingForm {
yourlsDomain: string
yourlsSignature: string
cfWorkerHost: string
sinkDomain: string
sinkToken: string
deleteLocalFile: boolean
serverKey: string
aesPassword: string

View File

@ -71,6 +71,8 @@ export interface IConfigStruct {
cfWorkerHost: string
yourlsDomain: string
yourlsSignature: string
sinkDomain: string
sinkToken: string
isSilentNotice: boolean
proxy: string
registry: string
@ -153,6 +155,8 @@ export const configPaths = {
cfWorkerHost: 'settings.cfWorkerHost',
yourlsDomain: 'settings.yourlsDomain',
yourlsSignature: 'settings.yourlsSignature',
sinkDomain: 'settings.sinkDomain',
sinkToken: 'settings.sinkToken',
isSilentNotice: 'settings.isSilentNotice',
proxy: 'settings.proxy',
registry: 'settings.registry',