mirror of
https://github.com/anidl/multi-downloader-nx.git
synced 2026-04-20 16:02:14 +00:00
Merge branch 'anidl:master' into master
This commit is contained in:
commit
c0aa3fa5df
10 changed files with 149 additions and 29 deletions
10
@types/crunchyTypes.d.ts
vendored
10
@types/crunchyTypes.d.ts
vendored
|
|
@ -22,7 +22,10 @@ export type CrunchyDownloadOptions = {
|
|||
videoTitle: string,
|
||||
force: 'Y'|'y'|'N'|'n'|'C'|'c',
|
||||
ffmpegOptions: string[],
|
||||
mkvmergeOptions: string[]
|
||||
mkvmergeOptions: string[],
|
||||
defaultSub: LanguageItem,
|
||||
defaultAudio: LanguageItem,
|
||||
ccTag: string
|
||||
}
|
||||
|
||||
export type CurnchyMultiDownload = {
|
||||
|
|
@ -41,7 +44,10 @@ export type CrunchyMuxOptions = {
|
|||
nocleanup?: boolean,
|
||||
videoTitle: string,
|
||||
ffmpegOptions: string[],
|
||||
mkvmergeOptions: string[]
|
||||
mkvmergeOptions: string[],
|
||||
defaultSub: LanguageItem,
|
||||
defaultAudio: LanguageItem,
|
||||
ccTag: string
|
||||
}
|
||||
|
||||
export type CrunchyEpMeta = {
|
||||
|
|
|
|||
4
@types/messageHandler.d.ts
vendored
4
@types/messageHandler.d.ts
vendored
|
|
@ -93,8 +93,8 @@ export type FuniGetEpisodeData = { subs: FuniSubsData, fnSlug: FuniEpisodeData,
|
|||
export type FuniStreamData = { force?: 'Y'|'y'|'N'|'n'|'C'|'c', callbackMaker?: (data: DownloadInfo) => HLSCallback, q: number, x: number, fileName: string, numbers: number, novids?: boolean,
|
||||
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,
|
||||
ffmpegOptions: string[], mkvmergeOptions: string[] }
|
||||
export type FuniSubsData = { nosubs?: boolean, sub: boolean, dlsubs: string[] }
|
||||
ffmpegOptions: string[], mkvmergeOptions: string[], defaultAudio: LanguageItem, defaultSub: LanguageItem, ccTag: string }
|
||||
export type FuniSubsData = { nosubs?: boolean, sub: boolean, dlsubs: string[], ccTag: string }
|
||||
export type DownloadData = { id: string, e: string, dubLang: string[], dlsubs: string[], fileName: string, q: number, novids: boolean, noaudio: boolean }
|
||||
|
||||
export type AuthResponse = ResponseBase<undefined>;
|
||||
|
|
|
|||
11
crunchy.ts
11
crunchy.ts
|
|
@ -1202,8 +1202,8 @@ export default class Crunchy implements ServiceClass {
|
|||
const langItem = subsItem.locale;
|
||||
const sxData: Partial<sxItem> = {};
|
||||
sxData.language = langItem;
|
||||
const isCC = langItem.code === audDub
|
||||
sxData.file = langsData.subsFile(fileName as string, subsIndex, langItem, isCC);
|
||||
const isCC = langItem.code === audDub;
|
||||
sxData.file = langsData.subsFile(fileName as string, subsIndex, langItem, isCC, options.ccTag);
|
||||
sxData.path = path.join(this.cfg.dir.content, sxData.file);
|
||||
if (files.some(a => a.type === 'Subtitle' && (a.language.cr_locale == langItem.cr_locale || a.language.locale == langItem.locale) && a.cc === isCC))
|
||||
continue;
|
||||
|
|
@ -1278,7 +1278,12 @@ export default class Crunchy implements ServiceClass {
|
|||
options: {
|
||||
ffmpeg: options.ffmpegOptions,
|
||||
mkvmerge: options.mkvmergeOptions
|
||||
}
|
||||
},
|
||||
defaults: {
|
||||
audio: options.defaultAudio,
|
||||
sub: options.defaultSub
|
||||
},
|
||||
ccTag: options.ccTag
|
||||
});
|
||||
const bin = Merger.checkMerger(this.cfg.bin, options.mp4, options.forceMuxer);
|
||||
// collect fonts info
|
||||
|
|
|
|||
|
|
@ -288,6 +288,20 @@ Set the options given to mkvmerge
|
|||
| Both | `--ffmpegOptions ${args}` | `array` | `No`| `NaN` | ``| `ffmpegOptions: ` |
|
||||
|
||||
Set the options given to ffmpeg
|
||||
#### `--defaultAudio`
|
||||
| **Service** | **Usage** | **Type** | **Required** | **Alias** | **Default** |**cli-default Entry**
|
||||
| --- | --- | --- | --- | --- | --- | ---|
|
||||
| Both | `--defaultAudio ${args}` | `string` | `No`| `NaN` | `eng`| `defaultAudio: ` |
|
||||
|
||||
Set the default audio track by language code
|
||||
Possible Values: eng, spa, spa, spa, por, por, fra, deu, ara, ara, ita, rus, tur, hin, cmn, zho, kor, jpn
|
||||
#### `--defaultSub`
|
||||
| **Service** | **Usage** | **Type** | **Required** | **Alias** | **Default** |**cli-default Entry**
|
||||
| --- | --- | --- | --- | --- | --- | ---|
|
||||
| Both | `--defaultSub ${args}` | `string` | `No`| `NaN` | `eng`| `defaultSub: ` |
|
||||
|
||||
Set the default subtitle track by language code
|
||||
Possible Values: eng, spa, spa, spa, por, por, fra, deu, ara, ara, ita, rus, tur, hin, cmn, zho, kor, jpn
|
||||
### Filename Template
|
||||
#### `--fileName`
|
||||
| **Service** | **Usage** | **Type** | **Required** | **Alias** | **Default** |**cli-default Entry**
|
||||
|
|
@ -312,6 +326,12 @@ Set in config: 1; Episode number: 20; Output: 20
|
|||
| Both | `--override "${toOverride}='${value}'"` | `array` | `No`| `NaN` | ``| `override: ` |
|
||||
|
||||
Override a template variable
|
||||
#### `--ccTag`
|
||||
| **Service** | **Usage** | **Type** | **Required** | **Alias** | **Default** |**cli-default Entry**
|
||||
| --- | --- | --- | --- | --- | --- | ---|
|
||||
| Both | `--ccTag ${tag}` | `string` | `No`| `NaN` | `cc`| `ccTag: ` |
|
||||
|
||||
Used to set the name for subtitles that contain tranlations for none verbal communication (e.g. signs)
|
||||
### Debug
|
||||
#### `--nosess`
|
||||
| **Service** | **Usage** | **Type** | **Required** | **Alias** | **Default** |**cli-default Entry**
|
||||
|
|
|
|||
33
funi.ts
33
funi.ts
|
|
@ -103,7 +103,7 @@ export default class Funi implements ServiceClass {
|
|||
}
|
||||
let ok = true;
|
||||
for (const episodeData of data.value) {
|
||||
if ((await this.getEpisode(true, { subs: { dlsubs: argv.dlsubs, nosubs: argv.nosubs, sub: false }, dubLang: argv.dubLang, fnSlug: episodeData, s: argv.s, simul: argv.simul }, {
|
||||
if ((await this.getEpisode(true, { subs: { dlsubs: argv.dlsubs, nosubs: argv.nosubs, sub: false, ccTag: argv.ccTag }, dubLang: argv.dubLang, fnSlug: episodeData, s: argv.s, simul: argv.simul }, {
|
||||
ass: false,
|
||||
...argv
|
||||
})).isOk !== true)
|
||||
|
|
@ -368,7 +368,7 @@ export default class Funi implements ServiceClass {
|
|||
language: m.language,
|
||||
version: m.version,
|
||||
type: m.experienceType,
|
||||
subtitles: await this.getSubsUrl(m.mediaChildren, m.language, data.subs, ep.ids.externalEpisodeId)
|
||||
subtitles: await this.getSubsUrl(m.mediaChildren, m.language, data.subs, ep.ids.externalEpisodeId, data.subs.ccTag)
|
||||
};
|
||||
}
|
||||
else{
|
||||
|
|
@ -481,7 +481,7 @@ export default class Funi implements ServiceClass {
|
|||
}
|
||||
}
|
||||
|
||||
public async downloadStreams(log: boolean, epsiode: FunimationMediaDownload, data: FuniStreamData): Promise<boolean|void> {
|
||||
public async downloadStreams(log: boolean, episode: FunimationMediaDownload, data: FuniStreamData): Promise<boolean|void> {
|
||||
|
||||
// req playlist
|
||||
|
||||
|
|
@ -639,8 +639,8 @@ export default class Funi implements ServiceClass {
|
|||
|
||||
fnOutput = parseFileName(data.fileName, ([
|
||||
['episode', isNaN(parseInt(fnEpNum as string)) ? fnEpNum : parseInt(fnEpNum as string), true],
|
||||
['title', epsiode.title, true],
|
||||
['showTitle', epsiode.showTitle, true],
|
||||
['title', episode.title, true],
|
||||
['showTitle', episode.showTitle, true],
|
||||
['season', season, false],
|
||||
['width', plLayersRes[selectedQuality].width, false],
|
||||
['height', plLayersRes[selectedQuality].height, false],
|
||||
|
|
@ -693,10 +693,10 @@ export default class Funi implements ServiceClass {
|
|||
dlFailed = !await this.downloadFile(tsFile, chunkList, data.timeout, data.partsize, data.fsRetryTime, data.force, data.callbackMaker ? data.callbackMaker({
|
||||
fileName: `${fnOutput.slice(-1)}.video${(plAud?.uri ? '' : '.' + streamPath.lang.code )}.ts`,
|
||||
parent: {
|
||||
title: epsiode.showTitle
|
||||
title: episode.showTitle
|
||||
},
|
||||
title: epsiode.title,
|
||||
image: epsiode.image,
|
||||
title: episode.title,
|
||||
image: episode.image,
|
||||
language: streamPath.lang,
|
||||
}) : undefined);
|
||||
if (!dlFailed) {
|
||||
|
|
@ -734,10 +734,10 @@ export default class Funi implements ServiceClass {
|
|||
dlFailedA = !await this.downloadFile(tsFileA, chunkListA, data.timeout, data.partsize, data.fsRetryTime, data.force, data.callbackMaker ? data.callbackMaker({
|
||||
fileName: `${fnOutput.slice(-1)}.audio.${plAud.language.code}.ts`,
|
||||
parent: {
|
||||
title: epsiode.showTitle
|
||||
title: episode.showTitle
|
||||
},
|
||||
title: epsiode.title,
|
||||
image: epsiode.image,
|
||||
title: episode.title,
|
||||
image: episode.image,
|
||||
language: plAud.language
|
||||
}) : undefined);
|
||||
if (!dlFailedA)
|
||||
|
|
@ -819,7 +819,12 @@ export default class Funi implements ServiceClass {
|
|||
options: {
|
||||
ffmpeg: data.ffmpegOptions,
|
||||
mkvmerge: data.mkvmergeOptions
|
||||
}
|
||||
},
|
||||
defaults: {
|
||||
audio: data.defaultAudio,
|
||||
sub: data.defaultSub
|
||||
},
|
||||
ccTag: data.ccTag
|
||||
});
|
||||
|
||||
if(mergerBin.MKVmerge){
|
||||
|
|
@ -859,7 +864,7 @@ export default class Funi implements ServiceClass {
|
|||
return downloadStatus.ok;
|
||||
}
|
||||
|
||||
public async getSubsUrl(m: MediaChild[], parentLanguage: TitleElement|undefined, data: FuniSubsData, episodeID: string) : Promise<Subtitle[]> {
|
||||
public async getSubsUrl(m: MediaChild[], parentLanguage: TitleElement|undefined, data: FuniSubsData, episodeID: string, ccTag: string) : Promise<Subtitle[]> {
|
||||
if((data.nosubs && !data.sub) || data.dlsubs.includes('none')){
|
||||
return [];
|
||||
}
|
||||
|
|
@ -907,7 +912,7 @@ export default class Funi implements ServiceClass {
|
|||
});
|
||||
|
||||
return ret.map(a => ({
|
||||
ext: `.${a.lang.code}${a.isCC ? '.cc' : ''}`,
|
||||
ext: `.${a.lang.code}${a.isCC ? `.${ccTag}` : ''}`,
|
||||
lang: a.lang,
|
||||
url: a.url,
|
||||
closedCaption: a.isCC
|
||||
|
|
|
|||
|
|
@ -104,7 +104,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: data.dlsubs, sub: false } }, { ..._default, callbackMaker: this.makeProgressHandler.bind(this), ass: true, fileName: data.fileName, q: data.q, force: 'y',
|
||||
await this.funi.getEpisode(false, { dubLang: data.dubLang, fnSlug: ep, s: data.id, subs: { dlsubs: data.dlsubs, sub: false, ccTag: _default.ccTag } }, { ..._default, callbackMaker: this.makeProgressHandler.bind(this), ass: true, fileName: data.fileName, q: data.q, force: 'y',
|
||||
noaudio: data.noaudio, novids: data.novids });
|
||||
}
|
||||
this.sendMessage({ name: 'finish', data: undefined });
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
import yargs, { Choices } from 'yargs';
|
||||
import { args, AvailableMuxer, groups } from './module.args';
|
||||
import { LanguageItem } from './module.langsData';
|
||||
|
||||
let argvC: { [x: string]: unknown; ffmpegOptions: string[], mkvmergeOptions: string[], force: 'Y'|'y'|'N'|'n'|'C'|'c', skipUpdate: boolean, videoTitle: string, override: string[], fsRetryTime: number, forceMuxer: AvailableMuxer|undefined; username: string|undefined, password: string|undefined, silentAuth: boolean, skipSubMux: boolean, downloadArchive: boolean, addArchive: boolean, but: boolean, auth: boolean | undefined; dlFonts: boolean | undefined; search: string | undefined; 'search-type': string; page: number | undefined; 'search-locale': string; new: boolean | undefined; 'movie-listing': string | undefined; series: string | undefined; s: string | undefined; e: string | undefined; q: number; x: number; kstream: number; partsize: number; hslang: string; dlsubs: string[]; novids: boolean | undefined; noaudio: boolean | undefined; nosubs: boolean | undefined; dubLang: string[]; all: boolean; fontSize: number; allDubs: boolean; timeout: number; simul: boolean; mp4: boolean; skipmux: boolean | undefined; fileName: string; numbers: number; nosess: string; debug: boolean | undefined; nocleanup: boolean; help: boolean | undefined; service: 'funi' | 'crunchy'; update: boolean; fontName: string | undefined; _: (string | number)[]; $0: string; };
|
||||
let argvC: { [x: string]: unknown; ccTag: string, defaultAudio: LanguageItem, defaultSub: LanguageItem, ffmpegOptions: string[], mkvmergeOptions: string[], force: 'Y'|'y'|'N'|'n'|'C'|'c', skipUpdate: boolean, videoTitle: string, override: string[], fsRetryTime: number, forceMuxer: AvailableMuxer|undefined; username: string|undefined, password: string|undefined, silentAuth: boolean, skipSubMux: boolean, downloadArchive: boolean, addArchive: boolean, but: boolean, auth: boolean | undefined; dlFonts: boolean | undefined; search: string | undefined; 'search-type': string; page: number | undefined; 'search-locale': string; new: boolean | undefined; 'movie-listing': string | undefined; series: string | undefined; s: string | undefined; e: string | undefined; q: number; x: number; kstream: number; partsize: number; hslang: string; dlsubs: string[]; novids: boolean | undefined; noaudio: boolean | undefined; nosubs: boolean | undefined; dubLang: string[]; all: boolean; fontSize: number; allDubs: boolean; timeout: number; simul: boolean; mp4: boolean; skipmux: boolean | undefined; fileName: string; numbers: number; nosess: string; debug: boolean | undefined; nocleanup: boolean; help: boolean | undefined; service: 'funi' | 'crunchy'; update: boolean; fontName: string | undefined; _: (string | number)[]; $0: string; };
|
||||
|
||||
export type ArgvType = typeof argvC;
|
||||
|
||||
|
|
@ -58,6 +59,13 @@ const getArgv = (cfg: { [key:string]: unknown }) => {
|
|||
for (const item of data)
|
||||
argv.option(item.name, {
|
||||
...item,
|
||||
coerce: (value) => {
|
||||
if (item.transformer) {
|
||||
return item.transformer(value);
|
||||
} else {
|
||||
return value;
|
||||
}
|
||||
},
|
||||
choices: item.choices as unknown as Choices
|
||||
});
|
||||
return argv as unknown as yargs.Argv<typeof argvC>;
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ const availableFilenameVars: AvailableFilenameVars[] = [
|
|||
export type AvailableMuxer = 'ffmpeg' | 'mkvmerge'
|
||||
export const muxer: AvailableMuxer[] = [ 'ffmpeg', 'mkvmerge' ];
|
||||
|
||||
type TAppArg<T extends boolean|string|number|unknown[]> = {
|
||||
type TAppArg<T extends boolean|string|number|unknown[], K = any> = {
|
||||
name: string,
|
||||
group: keyof typeof groups,
|
||||
type: 'boolean'|'string'|'number'|'array',
|
||||
|
|
@ -41,7 +41,8 @@ type TAppArg<T extends boolean|string|number|unknown[]> = {
|
|||
},
|
||||
service: 'funi'|'crunchy'|'both',
|
||||
usage: string // -(-)${name} will be added for each command,
|
||||
demandOption?: true
|
||||
demandOption?: true,
|
||||
transformer?: (value: T) => K
|
||||
}
|
||||
|
||||
const args: TAppArg<boolean|number|string|unknown[]>[] = [
|
||||
|
|
@ -637,6 +638,56 @@ const args: TAppArg<boolean|number|string|unknown[]>[] = [
|
|||
default: {
|
||||
default: []
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'defaultAudio',
|
||||
describe: `Set the default audio track by language code\nPossible Values: ${languages.map(a => a.code).join(', ')}`,
|
||||
docDescribe: true,
|
||||
group: 'mux',
|
||||
service: 'both',
|
||||
type: 'string',
|
||||
usage: '${args}',
|
||||
default: {
|
||||
default: 'eng'
|
||||
},
|
||||
transformer: (val) => {
|
||||
const item = languages.find(a => a.code === val);
|
||||
if (!item) {
|
||||
throw new Error(`Unable to find language code ${val}!`);
|
||||
}
|
||||
return item;
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'defaultSub',
|
||||
describe: `Set the default subtitle track by language code\nPossible Values: ${languages.map(a => a.code).join(', ')}`,
|
||||
docDescribe: true,
|
||||
group: 'mux',
|
||||
service: 'both',
|
||||
type: 'string',
|
||||
usage: '${args}',
|
||||
default: {
|
||||
default: 'eng'
|
||||
},
|
||||
transformer: (val) => {
|
||||
const item = languages.find(a => a.code === val);
|
||||
if (!item) {
|
||||
throw new Error(`Unable to find language code ${val}!`);
|
||||
}
|
||||
return item;
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'ccTag',
|
||||
describe: 'Used to set the name for subtitles that contain tranlations for none verbal communication (e.g. signs)',
|
||||
docDescribe: true,
|
||||
group: 'fileName',
|
||||
service: 'both',
|
||||
type: 'string',
|
||||
usage: '${tag}',
|
||||
default: {
|
||||
default: 'cc'
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
|
|
|
|||
|
|
@ -131,9 +131,9 @@ const sortTags = (data: string[]) => {
|
|||
return sort.map(e => e.locale as string);
|
||||
};
|
||||
|
||||
const subsFile = (fnOutput:string, subsIndex: string, langItem: LanguageItem, isCC: boolean) => {
|
||||
const subsFile = (fnOutput:string, subsIndex: string, langItem: LanguageItem, isCC: boolean, ccTag: string) => {
|
||||
subsIndex = (parseInt(subsIndex) + 1).toString().padStart(2, '0');
|
||||
return `${fnOutput}.${subsIndex}.${langItem.code}.${langItem.language}${isCC ? '.cc' : ''}.ass`;
|
||||
return `${fnOutput}.${subsIndex}.${langItem.code}.${langItem.language}${isCC ? `.${ccTag}` : ''}.ass`;
|
||||
};
|
||||
|
||||
// construct dub langs const
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ export type MergerOptions = {
|
|||
onlyVid: MergerInput[],
|
||||
onlyAudio: MergerInput[],
|
||||
subtitles: SubtitleInput[],
|
||||
ccTag: string,
|
||||
output: string,
|
||||
videoTitle?: string,
|
||||
simul?: boolean,
|
||||
|
|
@ -39,6 +40,10 @@ export type MergerOptions = {
|
|||
ffmpeg: string[],
|
||||
mkvmerge: string[]
|
||||
},
|
||||
defaults: {
|
||||
audio: LanguageItem,
|
||||
sub: LanguageItem
|
||||
}
|
||||
}
|
||||
|
||||
class Merger {
|
||||
|
|
@ -112,7 +117,7 @@ class Merger {
|
|||
'-c:a copy',
|
||||
this.options.output.split('.').pop()?.toLowerCase() === 'mp4' ? '-c:s mov_text' : '-c:s ass',
|
||||
...this.options.subtitles.map((sub, subindex) => `-metadata:s:s:${subindex} title="${
|
||||
(sub.language.language || sub.language.name) + `${sub.closedCaption === true ? ' CC' : ''}`
|
||||
(sub.language.language || sub.language.name) + `${sub.closedCaption === true ? ` ${this.options.ccTag}` : ''}`
|
||||
}" -metadata:s:s:${subindex} language=${sub.language.code}`)
|
||||
);
|
||||
args.push(...this.options.options.ffmpeg);
|
||||
|
|
@ -163,12 +168,22 @@ class Merger {
|
|||
args.push('--track-name', `0:"${trackName}"`);
|
||||
//args.push('--track-name', `1:"${trackName}"`);
|
||||
args.push(`--language 1:${vid.lang.code}`);
|
||||
if (this.options.defaults.audio.code === vid.lang.code) {
|
||||
args.push('--default-track 1');
|
||||
} else {
|
||||
args.push('--default-track 1:0')
|
||||
}
|
||||
hasVideo = true;
|
||||
} else {
|
||||
args.push(
|
||||
'--no-video',
|
||||
'--audio-tracks 1'
|
||||
);
|
||||
if (this.options.defaults.audio.code === vid.lang.code) {
|
||||
args.push(`--default-track 1`)
|
||||
} else {
|
||||
args.push('--default-track 1:0')
|
||||
}
|
||||
args.push('--track-name', `1:"${vid.lang.name}"`);
|
||||
args.push(`--language 1:${vid.lang.code}`);
|
||||
}
|
||||
|
|
@ -183,13 +198,23 @@ class Merger {
|
|||
'--no-video',
|
||||
'--audio-tracks 0'
|
||||
);
|
||||
if (this.options.defaults.audio.code === aud.lang.code) {
|
||||
args.push('--default-track 0');
|
||||
} else {
|
||||
args.push('--default-track 0:0')
|
||||
}
|
||||
args.push(`"${aud.path}"`);
|
||||
}
|
||||
|
||||
if (this.options.subtitles.length > 0) {
|
||||
for (const subObj of this.options.subtitles) {
|
||||
args.push('--track-name', `0:"${(subObj.language.language || subObj.language.name) + `${subObj.closedCaption === true ? ' CC' : ''}`}"`);
|
||||
args.push('--track-name', `0:"${(subObj.language.language || subObj.language.name) + `${subObj.closedCaption === true ? ` ${this.options.ccTag}` : ''}`}"`);
|
||||
args.push('--language', `0:"${subObj.language.code}"`);
|
||||
if (this.options.defaults.sub.code === subObj.language.code) {
|
||||
args.push('--default-track 0');
|
||||
} else {
|
||||
args.push('--default-track 0:0')
|
||||
}
|
||||
args.push(`"${subObj.file}"`);
|
||||
}
|
||||
} else {
|
||||
|
|
|
|||
Loading…
Reference in a new issue