it just works
This commit is contained in:
61
frontend/src/features/core/argsParser.ts
Normal file
61
frontend/src/features/core/argsParser.ts
Normal file
@@ -0,0 +1,61 @@
|
||||
export class CliArguments {
|
||||
private _extractAudio: boolean;
|
||||
private _noMTime: boolean;
|
||||
private _proxy: string;
|
||||
|
||||
constructor(extractAudio = false, noMTime = false) {
|
||||
this._extractAudio = extractAudio;
|
||||
this._noMTime = noMTime;
|
||||
this._proxy = ""
|
||||
}
|
||||
|
||||
public get extractAudio(): boolean {
|
||||
return this._extractAudio;
|
||||
}
|
||||
|
||||
public toggleExtractAudio() {
|
||||
this._extractAudio = !this._extractAudio;
|
||||
return this;
|
||||
}
|
||||
|
||||
public disableExtractAudio() {
|
||||
this._extractAudio = false;
|
||||
return this;
|
||||
}
|
||||
|
||||
public get noMTime(): boolean {
|
||||
return this._noMTime;
|
||||
}
|
||||
|
||||
public toggleNoMTime() {
|
||||
this._noMTime = !this._noMTime;
|
||||
return this;
|
||||
}
|
||||
|
||||
public toString(): string {
|
||||
let args = '';
|
||||
|
||||
if (this._extractAudio) {
|
||||
args += '-x '
|
||||
}
|
||||
|
||||
if (this._noMTime) {
|
||||
args += '--no-mtime '
|
||||
}
|
||||
|
||||
return args.trim();
|
||||
}
|
||||
|
||||
public fromString(str: string): CliArguments {
|
||||
if (str) {
|
||||
if (str.includes('-x')) {
|
||||
this._extractAudio = true;
|
||||
}
|
||||
|
||||
if (str.includes('--no-mtime')) {
|
||||
this._noMTime = true;
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
}
|
||||
10
frontend/src/features/core/events.ts
Normal file
10
frontend/src/features/core/events.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
export function on(eventType: string, listener: any) {
|
||||
document.addEventListener(eventType, listener)
|
||||
}
|
||||
|
||||
export const serverStates = {
|
||||
PROC_DOWNLOAD: 'download',
|
||||
PROC_MERGING: 'merging',
|
||||
PROC_ABORT: 'abort',
|
||||
PROG_DONE: 'status_done',
|
||||
}
|
||||
28
frontend/src/features/core/intl.ts
Normal file
28
frontend/src/features/core/intl.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
// @ts-nocheck
|
||||
import i18n from "../../assets/i18n.yaml";
|
||||
|
||||
export default class I18nBuilder {
|
||||
private language: string;
|
||||
private textMap = i18n.languages;
|
||||
|
||||
constructor(language: string) {
|
||||
this.language = language;
|
||||
}
|
||||
|
||||
getLanguage(): string {
|
||||
return this.language;
|
||||
}
|
||||
|
||||
setLanguage(language: string): void {
|
||||
this.language = language;
|
||||
}
|
||||
|
||||
t(key: string): string {
|
||||
const map = this.textMap[this.language]
|
||||
if (map) {
|
||||
const translation = map[key];
|
||||
return translation ?? 'caption not defined';
|
||||
}
|
||||
return 'caption not defined';
|
||||
}
|
||||
}
|
||||
98
frontend/src/features/core/rpcClient.ts
Normal file
98
frontend/src/features/core/rpcClient.ts
Normal file
@@ -0,0 +1,98 @@
|
||||
import type { RPCRequest, RPCResponse, IDLMetadata } from "../../types"
|
||||
|
||||
import { getHttpRPCEndpoint } from '../../utils'
|
||||
|
||||
export class RPCClient {
|
||||
private socket: WebSocket
|
||||
private seq: number
|
||||
|
||||
constructor(socket: WebSocket) {
|
||||
this.socket = socket
|
||||
this.seq = 0
|
||||
}
|
||||
|
||||
private incrementSeq() {
|
||||
return String(this.seq++)
|
||||
}
|
||||
|
||||
private send(req: RPCRequest) {
|
||||
this.socket.send(JSON.stringify(req))
|
||||
}
|
||||
|
||||
private sendHTTP<T>(req: RPCRequest) {
|
||||
return new Promise<RPCResponse<T>>((resolve, reject) => {
|
||||
fetch(getHttpRPCEndpoint(), {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(req)
|
||||
})
|
||||
.then(res => res.json())
|
||||
.then(data => resolve(data))
|
||||
})
|
||||
}
|
||||
|
||||
public download(url: string, args: string, pathOverride = '', renameTo = '') {
|
||||
if (url) {
|
||||
this.send({
|
||||
id: this.incrementSeq(),
|
||||
method: 'Service.Exec',
|
||||
params: [{
|
||||
URL: url.split("?list").at(0)!,
|
||||
Params: args.split(" ").map(a => a.trim()),
|
||||
Path: pathOverride,
|
||||
Rename: renameTo,
|
||||
}]
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
public formats(url: string) {
|
||||
if (url) {
|
||||
return this.sendHTTP<IDLMetadata>({
|
||||
id: this.incrementSeq(),
|
||||
method: 'Service.Formats',
|
||||
params: [{
|
||||
URL: url.split("?list").at(0)!,
|
||||
}]
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
public running() {
|
||||
this.send({
|
||||
method: 'Service.Running',
|
||||
params: [],
|
||||
})
|
||||
}
|
||||
|
||||
public kill(id: string) {
|
||||
this.send({
|
||||
method: 'Service.Kill',
|
||||
params: [id],
|
||||
})
|
||||
}
|
||||
|
||||
public killAll() {
|
||||
this.send({
|
||||
method: 'Service.KillAll',
|
||||
params: [],
|
||||
})
|
||||
}
|
||||
|
||||
public freeSpace() {
|
||||
return this.sendHTTP<number>({
|
||||
method: 'Service.FreeSpace',
|
||||
params: [],
|
||||
})
|
||||
}
|
||||
|
||||
public directoryTree() {
|
||||
return this.sendHTTP<string[]>({
|
||||
method: 'Service.DirectoryTree',
|
||||
params: [],
|
||||
})
|
||||
}
|
||||
|
||||
public decode(data: any): RPCResponse<any> {
|
||||
return JSON.parse(data)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user