This commit is contained in:
Izuco 2022-03-04 19:58:56 +01:00
parent d1e88c120e
commit 2d139acffb
No known key found for this signature in database
GPG key ID: E9CBE9E4EF3A1BFA
12 changed files with 121 additions and 19 deletions

View file

@ -7,6 +7,7 @@ export interface MessageHandler {
checkToken: () => Promise<CheckTokenResponse>;
search: (data: SearchData) => Promise<SearchResponse>,
availableDubCodes: () => Promise<string[]>,
availableSubCodes: () => Promise<string[]>,
handleDefault: (name: string) => Promise<any>,
resolveItems: (data: ResolveItemsData) => Promise<ResponseBase<QueueItem[]>>,
listEpisodes: (id: string) => Promise<EpisodeListResponse>,
@ -23,6 +24,7 @@ export type QueueItem = {
episode: string,
ids: string[],
fileName: string,
dlsubs: string[],
parent: {
title: string,
season: string
@ -38,7 +40,8 @@ export type ResolveItemsData = {
but: boolean,
e: string,
fileName: string,
q: number
q: number,
dlsubs: string[]
}
export type SearchResponseItem = {
@ -87,7 +90,7 @@ export type FuniStreamData = { callbackMaker?: (data: DownloadInfo) => HLSCallba
timeout: number, partsize: number, fsRetryTime: number, noaudio?: boolean, mp4: boolean, ass: boolean, fontSize: number, fontName?: string, skipmux?: boolean,
forceMuxer: AvailableMuxer | undefined, simul: boolean, skipSubMux: boolean, nocleanup: boolean, override: string[], videoTitle: string }
export type FuniSubsData = { nosubs?: boolean, sub: boolean, dlsubs: string[] }
export type DownloadData = { id: string, e: string, dubLang: string[], fileName: string, q: number }
export type DownloadData = { id: string, e: string, dubLang: string[], dlsubs: string[], fileName: string, q: number }
export type AuthResponse = ResponseBase<undefined>;
export type FuniSearchReponse = ResponseBase<FunimationSearch>;

View file

@ -883,7 +883,7 @@ export default class Crunchy implements ServiceClass {
data: DownloadedMedia[],
fileName: string
} | undefined> {
console.log(options.dlsubs);
let mediaName = '...';
let fileName;
const variables: Variable[] = [];

View file

@ -12,6 +12,11 @@ export default (window: BrowserWindow) => {
handler = new Crunchy(window);
}
});
ipcMain.on('changeProvider', (ev) => {
handler = undefined;
ev.returnValue = true;
})
ipcMain.handle('type', async () => handler === undefined ? undefined : handler instanceof Funimation ? 'funi' : 'crunchy');
ipcMain.handle('auth', async (_, data) => handler?.auth(data));
@ -19,6 +24,7 @@ export default (window: BrowserWindow) => {
ipcMain.handle('search', async (_, data) => handler?.search(data));
ipcMain.handle('default', async (_, data) => handler?.handleDefault(data));
ipcMain.handle('availableDubCodes', async () => handler?.availableDubCodes());
ipcMain.handle('availableSubCodes', async () => handler?.availableSubCodes());
ipcMain.handle('resolveItems', async (_, data) => handler?.resolveItems(data));
ipcMain.handle('listEpisodes', async (_, data) => handler?.listEpisodes(data));
ipcMain.handle('downloadItem', async (_, data) => handler?.downloadItem(data));

View file

@ -1,11 +1,9 @@
import { BrowserWindow } from 'electron';
import { CrunchyDownloadOptions } from '../../../../@types/crunchyTypes';
import { AuthData, CheckTokenResponse, DownloadData, EpisodeListResponse, MessageHandler, QueueItem, ResolveItemsData, ResponseBase, SearchData, SearchResponse } from '../../../../@types/messageHandler';
import Crunchy from '../../../../crunchy';
import Funimation from '../../../../funi';
import { ArgvType } from '../../../../modules/module.app-args';
import { buildDefault, getDefault } from '../../../../modules/module.args';
import { dubLanguageCodes } from '../../../../modules/module.langsData';
import { languages, subtitleLanguagesFilter } from '../../../../modules/module.langsData';
import Base from './base';
class CrunchyHandler extends Base implements MessageHandler {
@ -24,7 +22,16 @@ class CrunchyHandler extends Base implements MessageHandler {
}
public async availableDubCodes(): Promise<string[]> {
return dubLanguageCodes;
const dubLanguageCodesArray = [];
for(const language of languages){
if (language.cr_locale)
dubLanguageCodesArray.push(language.code);
}
return [...new Set(dubLanguageCodesArray)];
}
public async availableSubCodes(): Promise<string[]> {
return subtitleLanguagesFilter;
}
public async resolveItems(data: ResolveItemsData): Promise<ResponseBase<QueueItem[]>> {
@ -76,7 +83,7 @@ class CrunchyHandler extends Base implements MessageHandler {
});
if (res.isOk) {
for (const select of res.value) {
if (!(await this.crunchy.downloadEpisode(select, {..._default, skipsubs: false, callbackMaker: this.makeProgressHandler.bind(this), q: data.q, fileName: data.fileName }))) {
if (!(await this.crunchy.downloadEpisode(select, {..._default, skipsubs: false, callbackMaker: this.makeProgressHandler.bind(this), q: data.q, fileName: data.fileName, dlsubs: data.dlsubs }))) {
const er = new Error(`Unable to download episode ${data.e} from ${data.id}`);
er.name = 'Download error';
this.alertError(er);

View file

@ -3,7 +3,7 @@ import { AuthData, CheckTokenResponse, DownloadData, EpisodeListResponse, Messag
import Funimation from '../../../../funi';
import { ArgvType } from '../../../../modules/module.app-args';
import { buildDefault, getDefault } from '../../../../modules/module.args';
import { dubLanguageCodes } from '../../../../modules/module.langsData';
import { languages, subtitleLanguagesFilter } from '../../../../modules/module.langsData';
import Base from './base';
class FunimationHandler extends Base implements MessageHandler {
@ -39,7 +39,16 @@ class FunimationHandler extends Base implements MessageHandler {
}
public async availableDubCodes(): Promise<string[]> {
return dubLanguageCodes;
const dubLanguageCodesArray = [];
for(const language of languages){
if (language.funi_locale)
dubLanguageCodesArray.push(language.code);
}
return [...new Set(dubLanguageCodesArray)];
}
public async availableSubCodes(): Promise<string[]> {
return subtitleLanguagesFilter;
}
public async resolveItems(data: ResolveItemsData): Promise<ResponseBase<QueueItem[]>> {
@ -91,7 +100,7 @@ class FunimationHandler extends Base implements MessageHandler {
return this.alertError(res.reason);
for (const ep of res.value) {
await this.funi.getEpisode(false, { dubLang: data.dubLang, fnSlug: ep, s: data.id, subs: { dlsubs: ['all'], sub: false } }, { ..._default, callbackMaker: this.makeProgressHandler.bind(this), ass: true, fileName: data.fileName, q: data.q });
await this.funi.getEpisode(false, { dubLang: data.dubLang, fnSlug: ep, s: data.id, subs: { dlsubs: data.dlsubs, sub: false } }, { ..._default, callbackMaker: this.makeProgressHandler.bind(this), ass: true, fileName: data.fileName, q: data.q });
}
this.sendMessage({ name: 'finish', data: undefined });
this.setDownloading(false);

View file

@ -11,6 +11,7 @@ const DownloadSelector: React.FC = () => {
const messageHandler = React.useContext(messageChannelContext);
const [store, dispatch] = useStore();
const [availableDubs, setAvailableDubs] = React.useState<string[]>([]);
const [availableSubs, setAvailableSubs ] = React.useState<string[]>([]);
const [ loading, setLoading ] = React.useState(false);
const { enqueueSnackbar } = useSnackbar();
@ -19,19 +20,22 @@ const DownloadSelector: React.FC = () => {
/* If we don't wait the response is undefined? */
await new Promise((resolve) => setTimeout(() => resolve(undefined), 100));
const dubLang = messageHandler?.handleDefault('dubLang');
const subLang = messageHandler?.handleDefault('dlsubs');
const q = messageHandler?.handleDefault('q');
const fileName = messageHandler?.handleDefault('fileName');
const result = await Promise.all([dubLang, q, fileName]);
const result = await Promise.all([dubLang, subLang, q, fileName]);
dispatch({
type: 'downloadOptions',
payload: {
...store.downloadOptions,
dubLang: result[0],
q: result[1],
fileName: result[2]
dlsubs: result[1],
q: result[2],
fileName: result[3],
}
});
setAvailableDubs(await messageHandler?.availableDubCodes() ?? []);
setAvailableSubs(await messageHandler?.availableSubCodes() ?? []);
})();
}, []);
@ -111,6 +115,17 @@ const DownloadSelector: React.FC = () => {
}}
allOption
/>
<MultiSelect
title='Sub Languages'
values={availableSubs}
selected={store.downloadOptions.dlsubs}
onChange={(e) => {
dispatch({
type: 'downloadOptions',
payload: { ...store.downloadOptions, dlsubs: e }
});
}}
/>
<TextField value={store.downloadOptions.fileName} onChange={e => {
dispatch({
type: 'downloadOptions',

View file

@ -59,7 +59,7 @@ const MultiSelect: React.FC<MultiSelectProps> = (props) => {
>
{props.values.concat(props.allOption ? 'all' : []).map((name) => (
<MenuItem
key={name}
key={`${props.title}_${name}`}
value={name}
style={getStyles(name, props.selected, theme)}
>

View file

@ -41,7 +41,7 @@ const MessageChannelProvider: React.FC = ({ children }) => {
const [store, dispatch] = useStore();
const { ipcRenderer } = (window as any).Electron as { ipcRenderer: IpcRenderer };
const [ randomEventHandler ] = React.useState(new RandomEventHandler());
const randomEventHandler = React.useMemo(() => new RandomEventHandler(), []);
React.useEffect(() => {
(async () => {
@ -51,7 +51,7 @@ const MessageChannelProvider: React.FC = ({ children }) => {
if (store.service !== currentService)
ipcRenderer.invoke('setup', store.service)
})();
}, [store.service])
}, [store.service, dispatch, ipcRenderer])
React.useEffect(() => {
/* finish is a placeholder */
@ -74,6 +74,7 @@ const MessageChannelProvider: React.FC = ({ children }) => {
search: async (data) => await ipcRenderer.invoke('search', data),
handleDefault: async (data) => await ipcRenderer.invoke('default', data),
availableDubCodes: async () => await ipcRenderer.invoke('availableDubCodes'),
availableSubCodes: async () => await ipcRenderer.invoke('availableSubCodes'),
resolveItems: async (data) => await ipcRenderer.invoke('resolveItems', data),
listEpisodes: async (data) => await ipcRenderer.invoke('listEpisodes', data),
randomEvents: randomEventHandler,

View file

@ -7,6 +7,7 @@ export type DownloadOptions = {
id: string,
e: string,
dubLang: typeof dubLanguageCodes,
dlsubs: string[],
fileName: string,
all: boolean,
but: boolean
@ -55,6 +56,7 @@ const initialState: StoreState = {
q: 0,
e: '',
dubLang: [ 'jpn' ],
dlsubs: [ 'all' ],
fileName: '',
all: false,
but: false

View file

@ -227,7 +227,7 @@ const args: TAppArg<boolean|number|string|unknown[]>[] = [
type: 'array',
choices: subtitleLanguagesFilter,
default: {
default: 'all'
default: [ 'all' ]
},
usage: '${sub1} ${sub2}'
},

59
package-lock.json generated
View file

@ -4584,6 +4584,14 @@
"node": ">= 6"
}
},
"node_modules/de-indent": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
"integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=",
"dev": true,
"optional": true,
"peer": true
},
"node_modules/debug": {
"version": "4.3.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
@ -6860,6 +6868,17 @@
"node": ">=8"
}
},
"node_modules/he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
"dev": true,
"optional": true,
"peer": true,
"bin": {
"he": "bin/he"
}
},
"node_modules/hls-download": {
"version": "2.6.8",
"resolved": "https://registry.npmjs.org/hls-download/-/hls-download-2.6.8.tgz",
@ -10944,6 +10963,18 @@
"node": ">=6.0"
}
},
"node_modules/vue-template-compiler": {
"version": "2.6.14",
"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz",
"integrity": "sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==",
"dev": true,
"optional": true,
"peer": true,
"dependencies": {
"de-indent": "^1.0.2",
"he": "^1.1.0"
}
},
"node_modules/watchpack": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz",
@ -14645,6 +14676,14 @@
"resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz",
"integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og=="
},
"de-indent": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
"integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=",
"dev": true,
"optional": true,
"peer": true
},
"debug": {
"version": "4.3.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
@ -16397,6 +16436,14 @@
"integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
"dev": true
},
"he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
"dev": true,
"optional": true,
"peer": true
},
"hls-download": {
"version": "2.6.8",
"resolved": "https://registry.npmjs.org/hls-download/-/hls-download-2.6.8.tgz",
@ -19466,6 +19513,18 @@
"acorn-walk": "^8.2.0"
}
},
"vue-template-compiler": {
"version": "2.6.14",
"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz",
"integrity": "sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==",
"dev": true,
"optional": true,
"peer": true,
"requires": {
"de-indent": "^1.0.2",
"he": "^1.1.0"
}
},
"watchpack": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz",

View file

@ -70,7 +70,7 @@
},
"scripts": {
"prestart": "npm run tsc test",
"start": "cd lib && electron-forge start",
"start": "cd lib && npx electron .",
"docs": "ts-node modules/build-docs.ts",
"tsc": "ts-node tsc.ts",
"prebuild-windows-cli": "npm run tsc false false",