Start of queue
This commit is contained in:
parent
162a89efc9
commit
1a5939791e
13 changed files with 330 additions and 85 deletions
29
@types/messageHandler.d.ts
vendored
29
@types/messageHandler.d.ts
vendored
|
|
@ -7,7 +7,30 @@ export interface MessageHandler {
|
|||
checkToken: () => Promise<CheckTokenResponse>;
|
||||
search: (data: SearchData) => Promise<SearchResponse>,
|
||||
availableDubCodes: () => Promise<string[]>,
|
||||
handleDefault: (name: string) => Promise<any>
|
||||
handleDefault: (name: string) => Promise<any>,
|
||||
resolveItems: (data: ResolveItemsData) => Promise<ResponseBase<QueueItem[]>>
|
||||
}
|
||||
|
||||
export type QueueItem = {
|
||||
title: string,
|
||||
ids: string[],
|
||||
fileName: string,
|
||||
parent: {
|
||||
title: string,
|
||||
season: string
|
||||
},
|
||||
q: number,
|
||||
dubLang: string[],
|
||||
}
|
||||
|
||||
export type ResolveItemsData = {
|
||||
id: string,
|
||||
dubLang: string[],
|
||||
all: boolean,
|
||||
but: boolean,
|
||||
e: string,
|
||||
fileName: string,
|
||||
q: number
|
||||
}
|
||||
|
||||
export type SearchResponseItem = {
|
||||
|
|
@ -24,7 +47,9 @@ export type SearchResponse = ResponseBase<SearchResponseItem[]>
|
|||
export type FuniEpisodeData = {
|
||||
title: string,
|
||||
episode: string,
|
||||
episodeID: string
|
||||
episodeID: string,
|
||||
seasonTitle: string,
|
||||
seasonNumber: string
|
||||
};
|
||||
|
||||
export type AuthData = { username: string, password: string };
|
||||
|
|
|
|||
10
funi.ts
10
funi.ts
|
|
@ -37,7 +37,7 @@ import { FunimationMediaDownload } from './@types/funiTypes';
|
|||
import * as langsData from './modules/module.langsData';
|
||||
import { TitleElement } from './@types/episode';
|
||||
import { AvailableFilenameVars } from './modules/module.args';
|
||||
import { AuthData, AuthResponse, CheckTokenResponse, FuniGetEpisodeData, FuniGetEpisodeResponse, FuniGetShowData, SearchData, FuniSearchReponse, FuniShowResponse, FuniStreamData, FuniSubsData } from './@types/messageHandler';
|
||||
import { AuthData, AuthResponse, CheckTokenResponse, FuniGetEpisodeData, FuniGetEpisodeResponse, FuniGetShowData, SearchData, FuniSearchReponse, FuniShowResponse, FuniStreamData, FuniSubsData, FuniEpisodeData } from './@types/messageHandler';
|
||||
import { ServiceClass } from './@types/serviceClassInterface';
|
||||
// check page
|
||||
|
||||
|
|
@ -248,11 +248,7 @@ export default class Funi implements ServiceClass {
|
|||
|
||||
const epSelList = parseSelect(data.e as string, data.but);
|
||||
|
||||
const fnSlug: {
|
||||
title: string,
|
||||
episode: string,
|
||||
episodeID: string
|
||||
}[] = []; let is_selected = false;
|
||||
const fnSlug: FuniEpisodeData[] = []; let is_selected = false;
|
||||
|
||||
const eps = epsDataArr;
|
||||
epsDataArr.sort((a, b) => {
|
||||
|
|
@ -271,7 +267,7 @@ export default class Funi implements ServiceClass {
|
|||
// select
|
||||
is_selected = false;
|
||||
if (data.all || epSelList.isSelected(epStrId)) {
|
||||
fnSlug.push({title:eps[e].item.titleSlug,episode:eps[e].item.episodeSlug, episodeID:epStrId});
|
||||
fnSlug.push({title:eps[e].item.titleSlug,episode:eps[e].item.episodeSlug, episodeID:epStrId, seasonTitle: eps[e].item.seasonTitle, seasonNumber: eps[e].item.seasonNum});
|
||||
epSelEpsTxt.push(epStrId);
|
||||
is_selected = true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ import Funimation from './serviceHandler/funimation';
|
|||
|
||||
export default () => {
|
||||
let handler: MessageHandler|undefined;
|
||||
|
||||
ipcMain.handle('setup', (_, data) => {
|
||||
if (data === 'funi') {
|
||||
handler = new Funimation();
|
||||
|
|
@ -14,9 +13,11 @@ export default () => {
|
|||
}
|
||||
});
|
||||
|
||||
ipcMain.handle('type', async () => handler === undefined ? undefined : handler instanceof Funimation ? 'funi' : 'crunchy');
|
||||
ipcMain.handle('auth', async (_, data) => handler?.auth(data));
|
||||
ipcMain.handle('checkToken', async () => handler?.checkToken());
|
||||
ipcMain.handle('search', async (_, data) => handler?.search(data));
|
||||
ipcMain.handle('default', async (_, data) => handler?.handleDefault(data));
|
||||
ipcMain.handle('availableDubCodes', async () => handler?.availableDubCodes());
|
||||
ipcMain.handle('resolveItems', async (_, data) => handler?.resolveItems(data));
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { AuthData, CheckTokenResponse, MessageHandler, SearchData, SearchResponse } from '../../../../@types/messageHandler';
|
||||
import { AuthData, CheckTokenResponse, MessageHandler, QueueItem, ResolveItemsData, ResponseBase, SearchData, SearchResponse } from '../../../../@types/messageHandler';
|
||||
import Crunchy from '../../../../crunchy';
|
||||
import Funimation from '../../../../funi';
|
||||
import { getDefault } from '../../../../modules/module.args';
|
||||
|
|
@ -20,6 +20,23 @@ class CrunchyHandler extends Base implements MessageHandler {
|
|||
return dubLanguageCodes;
|
||||
}
|
||||
|
||||
public async resolveItems(data: ResolveItemsData): Promise<ResponseBase<QueueItem[]>> {
|
||||
const res = await this.crunchy.downloadFromSeriesID(data.id, data);
|
||||
if (!res.isOk)
|
||||
return res;
|
||||
return { isOk: true, value: res.value.map(a => {
|
||||
return {
|
||||
ids: a.data.map(a => a.mediaId),
|
||||
title: a.episodeTitle,
|
||||
parent: {
|
||||
title: a.seasonTitle,
|
||||
season: a.season.toString()
|
||||
},
|
||||
...data
|
||||
};
|
||||
}) };
|
||||
}
|
||||
|
||||
public async search(data: SearchData): Promise<SearchResponse> {
|
||||
this.crunchy.refreshToken();
|
||||
const funiSearch = await this.crunchy.doSearch(data);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { AuthData, CheckTokenResponse, MessageHandler, SearchData, SearchResponse } from '../../../../@types/messageHandler';
|
||||
import { AuthData, CheckTokenResponse, MessageHandler, QueueItem, ResolveItemsData, ResponseBase, SearchData, SearchResponse } from '../../../../@types/messageHandler';
|
||||
import Funimation from '../../../../funi';
|
||||
import { getDefault } from '../../../../modules/module.args';
|
||||
import { dubLanguageCodes } from '../../../../modules/module.langsData';
|
||||
|
|
@ -19,6 +19,23 @@ class FunimationHandler extends Base implements MessageHandler {
|
|||
return dubLanguageCodes;
|
||||
}
|
||||
|
||||
public async resolveItems(data: ResolveItemsData): Promise<ResponseBase<QueueItem[]>> {
|
||||
const res = await this.funi.getShow(false, { ...data, id: parseInt(data.id) });
|
||||
if (!res.isOk)
|
||||
return res;
|
||||
return { isOk: true, value: res.value.map(a => {
|
||||
return {
|
||||
ids: [a.episodeID],
|
||||
title: a.title,
|
||||
parent: {
|
||||
title: a.seasonTitle,
|
||||
season: a.seasonNumber
|
||||
},
|
||||
...data
|
||||
};
|
||||
}) };
|
||||
}
|
||||
|
||||
public async search(data: SearchData): Promise<SearchResponse> {
|
||||
const funiSearch = await this.funi.searchShow(false, data);
|
||||
if (!funiSearch.isOk)
|
||||
|
|
|
|||
249
gui/react/package-lock.json
generated
249
gui/react/package-lock.json
generated
|
|
@ -11,6 +11,7 @@
|
|||
"@emotion/react": "^11.7.1",
|
||||
"@emotion/styled": "^11.6.0",
|
||||
"@mui/icons-material": "^5.3.1",
|
||||
"@mui/lab": "^5.0.0-alpha.66",
|
||||
"@mui/material": "^5.3.1",
|
||||
"@testing-library/jest-dom": "^5.16.1",
|
||||
"@testing-library/react": "^12.1.2",
|
||||
|
|
@ -20,7 +21,6 @@
|
|||
"@types/node": "^16.11.21",
|
||||
"@types/react": "^17.0.38",
|
||||
"@types/react-dom": "^17.0.11",
|
||||
"multi-downloader-nx": "file:../../",
|
||||
"notistack": "^2.0.3",
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2",
|
||||
|
|
@ -31,6 +31,7 @@
|
|||
},
|
||||
"../..": {
|
||||
"version": "2.0.18",
|
||||
"extraneous": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"cheerio": "^1.0.0-rc.10",
|
||||
|
|
@ -59,13 +60,14 @@
|
|||
"@types/fs-extra": "^9.0.13",
|
||||
"@types/node": "^16.11.9",
|
||||
"@types/yargs": "^17.0.7",
|
||||
"@typescript-eslint/eslint-plugin": "^4.33.0",
|
||||
"@typescript-eslint/parser": "^4.33.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.10.1",
|
||||
"@typescript-eslint/parser": "^5.10.1",
|
||||
"@vercel/webpack-asset-relocator-loader": "^1.7.0",
|
||||
"css-loader": "^6.5.1",
|
||||
"electron": "16.0.7",
|
||||
"eslint": "^7.30.0",
|
||||
"eslint-plugin-import": "^2.25.4",
|
||||
"eslint-plugin-react": "^7.28.0",
|
||||
"fork-ts-checker-webpack-plugin": "^6.5.0",
|
||||
"node-loader": "^2.0.0",
|
||||
"pkg": "^5.4.1",
|
||||
|
|
@ -1901,6 +1903,75 @@
|
|||
"resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz",
|
||||
"integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg=="
|
||||
},
|
||||
"node_modules/@date-io/core": {
|
||||
"version": "2.13.1",
|
||||
"resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.13.1.tgz",
|
||||
"integrity": "sha512-pVI9nfkf2qClb2Cxdq0Q4zJhdawMG4ybWZUVGifT78FDwzRMX2SwXBb55s5NRJk0HcIicDuxktmCtemZqMH1Zg=="
|
||||
},
|
||||
"node_modules/@date-io/date-fns": {
|
||||
"version": "2.13.1",
|
||||
"resolved": "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.13.1.tgz",
|
||||
"integrity": "sha512-8fmfwjiLMpFLD+t4NBwDx0eblWnNcgt4NgfT/uiiQTGI81fnPu9tpBMYdAcuWxaV7LLpXgzLBx1SYWAMDVUDQQ==",
|
||||
"dependencies": {
|
||||
"@date-io/core": "^2.13.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"date-fns": "^2.0.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"date-fns": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@date-io/dayjs": {
|
||||
"version": "2.13.1",
|
||||
"resolved": "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.13.1.tgz",
|
||||
"integrity": "sha512-5bL4WWWmlI4uGZVScANhHJV7Mjp93ec2gNeUHDqqLaMZhp51S0NgD25oqj/k0LqBn1cdU2MvzNpk/ObMmVv5cQ==",
|
||||
"dependencies": {
|
||||
"@date-io/core": "^2.13.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"dayjs": "^1.8.17"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"dayjs": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@date-io/luxon": {
|
||||
"version": "2.13.1",
|
||||
"resolved": "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.13.1.tgz",
|
||||
"integrity": "sha512-yG+uM7lXfwLyKKEwjvP8oZ7qblpmfl9gxQYae55ifbwiTs0CoCTkYkxEaQHGkYtTqGTzLqcb0O9Pzx6vgWg+yg==",
|
||||
"dependencies": {
|
||||
"@date-io/core": "^2.13.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"luxon": "^1.21.3 || ^2.x"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"luxon": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@date-io/moment": {
|
||||
"version": "2.13.1",
|
||||
"resolved": "https://registry.npmjs.org/@date-io/moment/-/moment-2.13.1.tgz",
|
||||
"integrity": "sha512-XX1X/Tlvl3TdqQy2j0ZUtEJV6Rl8tOyc5WOS3ki52He28Uzme4Ro/JuPWTMBDH63weSWIZDlbR7zBgp3ZA2y1A==",
|
||||
"dependencies": {
|
||||
"@date-io/core": "^2.13.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"moment": "^2.24.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"moment": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@electron/get": {
|
||||
"version": "1.13.1",
|
||||
"resolved": "https://registry.npmjs.org/@electron/get/-/get-1.13.1.tgz",
|
||||
|
|
@ -2924,6 +2995,60 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@mui/lab": {
|
||||
"version": "5.0.0-alpha.66",
|
||||
"resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.66.tgz",
|
||||
"integrity": "sha512-C/WB5vo+arkdbx3r1gRRKh4BcZJ763+ePcPHYj3pShDA1vG0jecp1RWO8MJ07SnsdfDHiKWtlUDJh+DpieR0Og==",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.16.7",
|
||||
"@date-io/date-fns": "^2.11.0",
|
||||
"@date-io/dayjs": "^2.11.0",
|
||||
"@date-io/luxon": "^2.11.1",
|
||||
"@date-io/moment": "^2.11.0",
|
||||
"@mui/base": "5.0.0-alpha.66",
|
||||
"@mui/system": "^5.3.0",
|
||||
"@mui/utils": "^5.3.0",
|
||||
"clsx": "^1.1.1",
|
||||
"prop-types": "^15.7.2",
|
||||
"react-is": "^17.0.2",
|
||||
"react-transition-group": "^4.4.2",
|
||||
"rifm": "^0.12.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/mui"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@mui/material": "^5.0.0",
|
||||
"@types/react": "^16.8.6 || ^17.0.0",
|
||||
"date-fns": "^2.25.0",
|
||||
"dayjs": "^1.10.7",
|
||||
"luxon": "^1.28.0 || ^2.0.0",
|
||||
"moment": "^2.29.1",
|
||||
"react": "^17.0.0",
|
||||
"react-dom": "^17.0.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
},
|
||||
"date-fns": {
|
||||
"optional": true
|
||||
},
|
||||
"dayjs": {
|
||||
"optional": true
|
||||
},
|
||||
"luxon": {
|
||||
"optional": true
|
||||
},
|
||||
"moment": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@mui/material": {
|
||||
"version": "5.3.1",
|
||||
"resolved": "https://registry.npmjs.org/@mui/material/-/material-5.3.1.tgz",
|
||||
|
|
@ -11855,10 +11980,6 @@
|
|||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
||||
},
|
||||
"node_modules/multi-downloader-nx": {
|
||||
"resolved": "../..",
|
||||
"link": true
|
||||
},
|
||||
"node_modules/multicast-dns": {
|
||||
"version": "6.2.3",
|
||||
"resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
|
||||
|
|
@ -14443,6 +14564,14 @@
|
|||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/rifm": {
|
||||
"version": "0.12.1",
|
||||
"resolved": "https://registry.npmjs.org/rifm/-/rifm-0.12.1.tgz",
|
||||
"integrity": "sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg==",
|
||||
"peerDependencies": {
|
||||
"react": ">=16.8"
|
||||
}
|
||||
},
|
||||
"node_modules/rimraf": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
|
||||
|
|
@ -18262,6 +18391,43 @@
|
|||
"resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz",
|
||||
"integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg=="
|
||||
},
|
||||
"@date-io/core": {
|
||||
"version": "2.13.1",
|
||||
"resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.13.1.tgz",
|
||||
"integrity": "sha512-pVI9nfkf2qClb2Cxdq0Q4zJhdawMG4ybWZUVGifT78FDwzRMX2SwXBb55s5NRJk0HcIicDuxktmCtemZqMH1Zg=="
|
||||
},
|
||||
"@date-io/date-fns": {
|
||||
"version": "2.13.1",
|
||||
"resolved": "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.13.1.tgz",
|
||||
"integrity": "sha512-8fmfwjiLMpFLD+t4NBwDx0eblWnNcgt4NgfT/uiiQTGI81fnPu9tpBMYdAcuWxaV7LLpXgzLBx1SYWAMDVUDQQ==",
|
||||
"requires": {
|
||||
"@date-io/core": "^2.13.1"
|
||||
}
|
||||
},
|
||||
"@date-io/dayjs": {
|
||||
"version": "2.13.1",
|
||||
"resolved": "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.13.1.tgz",
|
||||
"integrity": "sha512-5bL4WWWmlI4uGZVScANhHJV7Mjp93ec2gNeUHDqqLaMZhp51S0NgD25oqj/k0LqBn1cdU2MvzNpk/ObMmVv5cQ==",
|
||||
"requires": {
|
||||
"@date-io/core": "^2.13.1"
|
||||
}
|
||||
},
|
||||
"@date-io/luxon": {
|
||||
"version": "2.13.1",
|
||||
"resolved": "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.13.1.tgz",
|
||||
"integrity": "sha512-yG+uM7lXfwLyKKEwjvP8oZ7qblpmfl9gxQYae55ifbwiTs0CoCTkYkxEaQHGkYtTqGTzLqcb0O9Pzx6vgWg+yg==",
|
||||
"requires": {
|
||||
"@date-io/core": "^2.13.1"
|
||||
}
|
||||
},
|
||||
"@date-io/moment": {
|
||||
"version": "2.13.1",
|
||||
"resolved": "https://registry.npmjs.org/@date-io/moment/-/moment-2.13.1.tgz",
|
||||
"integrity": "sha512-XX1X/Tlvl3TdqQy2j0ZUtEJV6Rl8tOyc5WOS3ki52He28Uzme4Ro/JuPWTMBDH63weSWIZDlbR7zBgp3ZA2y1A==",
|
||||
"requires": {
|
||||
"@date-io/core": "^2.13.1"
|
||||
}
|
||||
},
|
||||
"@electron/get": {
|
||||
"version": "1.13.1",
|
||||
"resolved": "https://registry.npmjs.org/@electron/get/-/get-1.13.1.tgz",
|
||||
|
|
@ -19009,6 +19175,26 @@
|
|||
"@babel/runtime": "^7.16.7"
|
||||
}
|
||||
},
|
||||
"@mui/lab": {
|
||||
"version": "5.0.0-alpha.66",
|
||||
"resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.66.tgz",
|
||||
"integrity": "sha512-C/WB5vo+arkdbx3r1gRRKh4BcZJ763+ePcPHYj3pShDA1vG0jecp1RWO8MJ07SnsdfDHiKWtlUDJh+DpieR0Og==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.16.7",
|
||||
"@date-io/date-fns": "^2.11.0",
|
||||
"@date-io/dayjs": "^2.11.0",
|
||||
"@date-io/luxon": "^2.11.1",
|
||||
"@date-io/moment": "^2.11.0",
|
||||
"@mui/base": "5.0.0-alpha.66",
|
||||
"@mui/system": "^5.3.0",
|
||||
"@mui/utils": "^5.3.0",
|
||||
"clsx": "^1.1.1",
|
||||
"prop-types": "^15.7.2",
|
||||
"react-is": "^17.0.2",
|
||||
"react-transition-group": "^4.4.2",
|
||||
"rifm": "^0.12.1"
|
||||
}
|
||||
},
|
||||
"@mui/material": {
|
||||
"version": "5.3.1",
|
||||
"resolved": "https://registry.npmjs.org/@mui/material/-/material-5.3.1.tgz",
|
||||
|
|
@ -25512,49 +25698,6 @@
|
|||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
||||
},
|
||||
"multi-downloader-nx": {
|
||||
"version": "file:../..",
|
||||
"requires": {
|
||||
"@electron-forge/cli": "^6.0.0-beta.61",
|
||||
"@electron-forge/maker-deb": "^6.0.0-beta.61",
|
||||
"@electron-forge/maker-rpm": "^6.0.0-beta.61",
|
||||
"@electron-forge/maker-squirrel": "^6.0.0-beta.61",
|
||||
"@electron-forge/maker-zip": "^6.0.0-beta.61",
|
||||
"@electron-forge/plugin-webpack": "^6.0.0-beta.61",
|
||||
"@types/fs-extra": "^9.0.13",
|
||||
"@types/node": "^16.11.9",
|
||||
"@types/yargs": "^17.0.7",
|
||||
"@typescript-eslint/eslint-plugin": "^4.33.0",
|
||||
"@typescript-eslint/parser": "^4.33.0",
|
||||
"@vercel/webpack-asset-relocator-loader": "^1.7.0",
|
||||
"cheerio": "^1.0.0-rc.10",
|
||||
"css-loader": "^6.5.1",
|
||||
"dotenv": "^14.3.2",
|
||||
"electron": "16.0.7",
|
||||
"electron-squirrel-startup": "^1.0.0",
|
||||
"eslint": "^7.30.0",
|
||||
"eslint-plugin-import": "^2.25.4",
|
||||
"fork-ts-checker-webpack-plugin": "^6.5.0",
|
||||
"form-data": "^4.0.0",
|
||||
"fs-extra": "^10.0.0",
|
||||
"got": "^11.8.3",
|
||||
"hls-download": "^2.6.7",
|
||||
"iso-639": "^0.2.2",
|
||||
"lookpath": "^1.1.0",
|
||||
"m3u8-parsed": "^1.3.0",
|
||||
"node-loader": "^2.0.0",
|
||||
"pkg": "^5.4.1",
|
||||
"removeNPMAbsolutePaths": "^2.0.0",
|
||||
"sei-helper": "^3.3.0",
|
||||
"style-loader": "^3.3.1",
|
||||
"ts-loader": "^9.2.6",
|
||||
"ts-node": "^10.4.0",
|
||||
"typescript": "^4.5.5",
|
||||
"typescript-eslint": "^0.0.1-alpha.0",
|
||||
"yaml": "^1.10.0",
|
||||
"yargs": "^17.2.1"
|
||||
}
|
||||
},
|
||||
"multicast-dns": {
|
||||
"version": "6.2.3",
|
||||
"resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
|
||||
|
|
@ -27298,6 +27441,12 @@
|
|||
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
|
||||
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
|
||||
},
|
||||
"rifm": {
|
||||
"version": "0.12.1",
|
||||
"resolved": "https://registry.npmjs.org/rifm/-/rifm-0.12.1.tgz",
|
||||
"integrity": "sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg==",
|
||||
"requires": {}
|
||||
},
|
||||
"rimraf": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
"@emotion/react": "^11.7.1",
|
||||
"@emotion/styled": "^11.6.0",
|
||||
"@mui/icons-material": "^5.3.1",
|
||||
"@mui/lab": "^5.0.0-alpha.66",
|
||||
"@mui/material": "^5.3.1",
|
||||
"@testing-library/jest-dom": "^5.16.1",
|
||||
"@testing-library/react": "^12.1.2",
|
||||
|
|
|
|||
7
gui/react/src/components/Bottom/Bottom.tsx
Normal file
7
gui/react/src/components/Bottom/Bottom.tsx
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
import React from "react";
|
||||
|
||||
const Bottom: React.FC = () => {
|
||||
return <></>
|
||||
}
|
||||
|
||||
export default Bottom;
|
||||
|
|
@ -4,11 +4,13 @@ import useStore from "../../../hooks/useStore";
|
|||
import MultiSelect from "../../MultiSelect";
|
||||
import { messageChannelContext } from "../../../provider/MessageChannel";
|
||||
import { Check, Close } from "@mui/icons-material";
|
||||
import LoadingButton from '@mui/lab/LoadingButton';
|
||||
|
||||
const DownloadSelector: React.FC = () => {
|
||||
const messageHandler = React.useContext(messageChannelContext);
|
||||
const [store, dispatch] = useStore();
|
||||
const [availableDubs, setAvailableDubs] = React.useState<string[]>([]);
|
||||
const [ loading, setLoading ] = React.useState(false);
|
||||
|
||||
React.useEffect(() => {
|
||||
(async () => {
|
||||
|
|
@ -25,6 +27,21 @@ const DownloadSelector: React.FC = () => {
|
|||
})();
|
||||
}, []);
|
||||
|
||||
const addToQueue = async () => {
|
||||
setLoading(true);
|
||||
const res = await messageHandler?.resolveItems(store.downloadOptions);
|
||||
if (!res || !res.isOk) {
|
||||
window.alert(res?.reason.message ?? 'Unable to resolve data');
|
||||
} else {
|
||||
dispatch({
|
||||
type: 'queue',
|
||||
payload: res.value
|
||||
});
|
||||
}
|
||||
setLoading(false);
|
||||
}
|
||||
|
||||
console.log(store.queue);
|
||||
|
||||
return <Box sx={{ display: 'flex', flexDirection: 'column' }}>
|
||||
<Box sx={{ m: 2, gap: 1, display: 'flex', justifyContent: 'center', alignItems: 'center', flexWrap: 'wrap' }}>
|
||||
|
|
@ -69,8 +86,9 @@ const DownloadSelector: React.FC = () => {
|
|||
<Button onClick={() => dispatch({ type: 'downloadOptions', payload: { ...store.downloadOptions, all: !store.downloadOptions.all } })} variant={store.downloadOptions.all ? 'contained' : 'outlined'}>Download all</Button>
|
||||
<Button onClick={() => dispatch({ type: 'downloadOptions', payload: { ...store.downloadOptions, but: !store.downloadOptions.but } })} variant={store.downloadOptions.but ? 'contained' : 'outlined'}>Download all but</Button>
|
||||
</Box>
|
||||
<Box sx={{ flex: 0, m: 1, mb: 3, display: 'flex', justifyContent: 'center' }}>
|
||||
<Button variant='contained'>Add to Queue</Button>
|
||||
<Box sx={{ gap: 2, flex: 0, m: 1, mb: 3, display: 'flex', justifyContent: 'center' }}>
|
||||
<LoadingButton loading={loading} onClick={addToQueue} variant='contained'>Search for episodes</LoadingButton>
|
||||
<LoadingButton loading={loading} onClick={addToQueue} variant='contained'>Add to Queue</LoadingButton>
|
||||
</Box>
|
||||
</Box>
|
||||
};
|
||||
|
|
|
|||
|
|
@ -27,11 +27,11 @@ ReactDOM.render(
|
|||
)}
|
||||
>
|
||||
<Style>
|
||||
<ServiceProvider>
|
||||
<MessageChannel>
|
||||
<MessageChannel>
|
||||
<ServiceProvider>
|
||||
<App />
|
||||
</MessageChannel>
|
||||
</ServiceProvider>
|
||||
</ServiceProvider>
|
||||
</MessageChannel>
|
||||
</Style>
|
||||
</SnackbarProvider>
|
||||
</Store>
|
||||
|
|
|
|||
|
|
@ -1,26 +1,34 @@
|
|||
import React from 'react';
|
||||
import type { AuthData, AuthResponse, MessageHandler, ResponseBase, SearchData } from '../../../../@types/messageHandler';
|
||||
import { serviceContext } from './ServiceProvider';
|
||||
import type { MessageHandler } from '../../../../@types/messageHandler';
|
||||
import type { IpcRenderer } from "electron";
|
||||
import useStore from '../hooks/useStore';
|
||||
|
||||
|
||||
export const messageChannelContext = React.createContext<MessageHandler|undefined>(undefined);
|
||||
|
||||
const MessageChannelProvider: React.FC = ({ children }) => {
|
||||
|
||||
const service = React.useContext(serviceContext);
|
||||
const [store, dispatch] = useStore();
|
||||
|
||||
const { ipcRenderer } = (window as any).Electron as { ipcRenderer: IpcRenderer };
|
||||
|
||||
React.useEffect(() => {
|
||||
ipcRenderer.invoke('setup', service);
|
||||
}, [service])
|
||||
(async () => {
|
||||
const currentService = await ipcRenderer.invoke('type');
|
||||
if (currentService !== undefined)
|
||||
return dispatch({ type: 'service', payload: currentService });
|
||||
if (store.service !== currentService)
|
||||
ipcRenderer.invoke('setup', store.service)
|
||||
})();
|
||||
}, [store.service])
|
||||
|
||||
const messageHandler: MessageHandler = {
|
||||
auth: async (data) => await ipcRenderer.invoke('auth', data),
|
||||
checkToken: async () => await ipcRenderer.invoke('checkToken'),
|
||||
search: async (data) => await ipcRenderer.invoke('search', data),
|
||||
handleDefault: async (data) => await ipcRenderer.invoke('default', data),
|
||||
availableDubCodes: async () => await ipcRenderer.invoke('availableDubCodes')
|
||||
availableDubCodes: async () => await ipcRenderer.invoke('availableDubCodes'),
|
||||
resolveItems: async (data) => await ipcRenderer.invoke('resolveItems', data)
|
||||
}
|
||||
|
||||
return <messageChannelContext.Provider value={messageHandler}>
|
||||
|
|
|
|||
|
|
@ -1,13 +1,21 @@
|
|||
import React from 'react';
|
||||
import {Divider, Box, Button, Typography} from '@mui/material';
|
||||
import useStore from '../hooks/useStore';
|
||||
import { StoreState } from './Store';
|
||||
|
||||
type Services = 'funi'|'crunchy';
|
||||
|
||||
export const serviceContext = React.createContext<Services|undefined>(undefined);
|
||||
|
||||
const ServiceProvider: React.FC = ({ children }) => {
|
||||
const [service, setService] = React.useState<Services|undefined>();
|
||||
const [ { service }, dispatch ] = useStore();
|
||||
|
||||
const setService = (s: StoreState['service']) => {
|
||||
dispatch({
|
||||
type: 'service',
|
||||
payload: s
|
||||
});
|
||||
}
|
||||
|
||||
return service === undefined ?
|
||||
<Box>
|
||||
|
|
|
|||
|
|
@ -1,10 +1,7 @@
|
|||
import React from 'react';
|
||||
import { QueueItem } from '../../../../@types/messageHandler';
|
||||
import { dubLanguageCodes } from '../../../../modules/module.langsData';
|
||||
|
||||
export type QueueItem = {
|
||||
|
||||
}
|
||||
|
||||
export type DownloadOptions = {
|
||||
q: number,
|
||||
id: string,
|
||||
|
|
@ -17,7 +14,8 @@ export type DownloadOptions = {
|
|||
|
||||
export type StoreState = {
|
||||
queue: QueueItem[],
|
||||
downloadOptions: DownloadOptions
|
||||
downloadOptions: DownloadOptions,
|
||||
service: 'crunchy'|'funi'|undefined
|
||||
}
|
||||
|
||||
export type StoreAction<T extends keyof StoreState> = {
|
||||
|
|
@ -28,11 +26,10 @@ export type StoreAction<T extends keyof StoreState> = {
|
|||
const Reducer = <T extends keyof StoreState,>(state: StoreState, action: StoreAction<T>): StoreState => {
|
||||
switch(action.type) {
|
||||
case "queue":
|
||||
return { ...state, queue: state.queue.concat(action.payload) };
|
||||
case "downloadOptions":
|
||||
return { ...state, downloadOptions: action.payload as DownloadOptions };
|
||||
return { ...state, queue: state.queue.concat(action.payload as QueueItem[]) };
|
||||
default:
|
||||
return { ...state, [action.type]: action.payload }
|
||||
}
|
||||
return state;
|
||||
};
|
||||
|
||||
const initialState: StoreState = {
|
||||
|
|
@ -45,7 +42,8 @@ const initialState: StoreState = {
|
|||
fileName: '[${service}] ${showTitle} - S${season}E${episode} [${height}p]',
|
||||
all: false,
|
||||
but: false
|
||||
}
|
||||
},
|
||||
service: undefined
|
||||
};
|
||||
|
||||
const Store: React.FC = ({children}) => {
|
||||
|
|
|
|||
Loading…
Reference in a new issue