Start of queue

This commit is contained in:
Izuco 2022-01-30 21:01:20 +01:00
parent 162a89efc9
commit 1a5939791e
No known key found for this signature in database
GPG key ID: E9CBE9E4EF3A1BFA
13 changed files with 330 additions and 85 deletions

View file

@ -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
View file

@ -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;
}

View file

@ -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));
};

View file

@ -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);

View file

@ -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)

View file

@ -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",

View file

@ -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",

View file

@ -0,0 +1,7 @@
import React from "react";
const Bottom: React.FC = () => {
return <></>
}
export default Bottom;

View file

@ -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>
};

View file

@ -27,11 +27,11 @@ ReactDOM.render(
)}
>
<Style>
<ServiceProvider>
<MessageChannel>
<MessageChannel>
<ServiceProvider>
<App />
</MessageChannel>
</ServiceProvider>
</ServiceProvider>
</MessageChannel>
</Style>
</SnackbarProvider>
</Store>

View file

@ -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}>

View file

@ -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>

View file

@ -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}) => {