Added Test Connection button for whisper provider

pull/2427/head v1.4.3-beta.7
JayZed 12 months ago committed by GitHub
parent 345b6b3718
commit afa529c4b3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -164,7 +164,7 @@ def configured():
@ui_bp.route('/test/<protocol>/<path:url>', methods=['GET']) @ui_bp.route('/test/<protocol>/<path:url>', methods=['GET'])
def proxy(protocol, url): def proxy(protocol, url):
if protocol.lower() not in ['http', 'https']: if protocol.lower() not in ['http', 'https']:
return dict(status=False, error='Unsupported protocol') return dict(status=False, error='Unsupported protocol', code=0)
url = f'{protocol}://{unquote(url)}' url = f'{protocol}://{unquote(url)}'
params = request.args params = request.args
try: try:
@ -175,14 +175,14 @@ def proxy(protocol, url):
if result.status_code == 200: if result.status_code == 200:
try: try:
version = result.json()['version'] version = result.json()['version']
return dict(status=True, version=version) return dict(status=True, version=version, code=result.status_code)
except Exception: except Exception:
return dict(status=False, error='Error Occurred. Check your settings.') return dict(status=False, error='Error Occurred. Check your settings.', code=result.status_code)
elif result.status_code == 401: elif result.status_code == 401:
return dict(status=False, error='Access Denied. Check API key.') return dict(status=False, error='Access Denied. Check API key.', code=result.status_code)
elif result.status_code == 404: elif result.status_code == 404:
return dict(status=False, error='Cannot get version. Maybe unsupported legacy API call?') return dict(status=False, error='Cannot get version. Maybe unsupported legacy API call?', code=result.status_code)
elif 300 <= result.status_code <= 399: elif 300 <= result.status_code <= 399:
return dict(status=False, error='Wrong URL Base.') return dict(status=False, error='Wrong URL Base.', code=result.status_code)
else: else:
return dict(status=False, error=result.raise_for_status()) return dict(status=False, error=result.raise_for_status(), code=result.status_code)

@ -4,10 +4,12 @@ type UrlTestResponse =
| { | {
status: true; status: true;
version: string; version: string;
code: number;
} }
| { | {
status: false; status: false;
error: string; error: string;
code: number;
}; };
class RequestUtils { class RequestUtils {
@ -31,6 +33,18 @@ class RequestUtils {
return result.data; return result.data;
} }
} }
async providerUrlTest(protocol: string, url: string, params?: LooseObject) {
const result = await client.axios.get<UrlTestResponse>(
`../test/${protocol}/${url}status`,
{ params },
);
const { data } = result;
if (data.status && data.version) {
return data;
}
return result.data;
}
} }
const requestUtils = new RequestUtils(); const requestUtils = new RequestUtils();

@ -27,6 +27,7 @@ import {
Selector as GlobalSelector, Selector as GlobalSelector,
Message, Message,
Password, Password,
ProviderTestButton,
Text, Text,
} from "../components"; } from "../components";
import { import {
@ -255,6 +256,11 @@ const ProviderTool: FunctionComponent<ProviderToolProps> = ({
></GlobalSelector>, ></GlobalSelector>,
); );
return; return;
case "testbutton":
elements.push(
<ProviderTestButton category={key}></ProviderTestButton>,
);
return;
case "chips": case "chips":
elements.push( elements.push(
<Chips <Chips
@ -278,6 +284,7 @@ const ProviderTool: FunctionComponent<ProviderToolProps> = ({
<Stack> <Stack>
<Stack spacing="xs"> <Stack spacing="xs">
<Selector <Selector
data-autofocus
searchable searchable
placeholder="Click to Select a Provider" placeholder="Click to Select a Provider"
itemComponent={SelectItem} itemComponent={SelectItem}

@ -15,6 +15,7 @@ type AvailableInput =
| Input<string, "password"> | Input<string, "password">
| Input<boolean, "switch"> | Input<boolean, "switch">
| Input<string, "select"> | Input<string, "select">
| Input<string, "testbutton">
| Input<ReactText[], "chips">; | Input<ReactText[], "chips">;
export interface ProviderInfo { export interface ProviderInfo {
@ -502,6 +503,11 @@ export const ProviderList: Readonly<ProviderInfo[]> = [
name: "Logging level", name: "Logging level",
options: logLevelOptions, options: logLevelOptions,
}, },
{
type: "testbutton",
key: "whisperai",
name: "Test Connection button",
},
], ],
}, },
{ key: "wizdom", description: "Wizdom.xyz Subtitles Provider" }, { key: "wizdom", description: "Wizdom.xyz Subtitles Provider" },

@ -1,6 +1,6 @@
import api from "@/apis/raw"; import api from "@/apis/raw";
import { Button } from "@mantine/core"; import { Button } from "@mantine/core";
import { FunctionComponent, useCallback, useState } from "react"; import { FunctionComponent, useCallback, useEffect, useState } from "react";
import { useSettingValue } from "../utilities/hooks"; import { useSettingValue } from "../utilities/hooks";
export const URLTestButton: FunctionComponent<{ export const URLTestButton: FunctionComponent<{
@ -62,6 +62,57 @@ export const URLTestButton: FunctionComponent<{
); );
}; };
export const ProviderTestButton: FunctionComponent<{
category: string;
}> = ({ category }) => {
const testConnection = "Test Connection";
const [title, setTitle] = useState(testConnection);
const [color, setVar] = useState("primary");
const testUrl = useSettingValue<string>(`settings-${category}-endpoint`);
const click = useCallback(() => {
if (testUrl !== null) {
const urlWithoutProtocol = new URL(testUrl).host;
const request = {
protocol: "http",
url: urlWithoutProtocol,
};
if (!request.url.endsWith("/")) {
request.url += "/";
}
api.utils
.providerUrlTest(request.protocol, request.url)
.then((result) => {
if (result.status) {
setTitle(`${result.version}`);
setVar("success");
} else {
setVar("danger");
if (result.code === 404) {
setTitle(
"Connected but no version found (possibly whisper-asr?)",
);
} else {
setTitle(result.error);
}
}
});
}
}, [testUrl]);
useEffect(() => {
setTitle(testConnection);
}, [testUrl]);
return (
<Button onClick={click} color={color} title={title}>
{title}
</Button>
);
};
export * from "./Card"; export * from "./Card";
export * from "./Layout"; export * from "./Layout";
export { default as Layout } from "./Layout"; export { default as Layout } from "./Layout";

Loading…
Cancel
Save