This commit is contained in:
parent
d1e88c120e
commit
2d139acffb
12 changed files with 121 additions and 19 deletions
7
@types/messageHandler.d.ts
vendored
7
@types/messageHandler.d.ts
vendored
|
|
@ -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>;
|
||||
|
|
|
|||
|
|
@ -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[] = [];
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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)}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
59
package-lock.json
generated
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
Loading…
Reference in a new issue