mirror of
https://github.com/anidl/multi-downloader-nx.git
synced 2026-01-11 20:10:20 +00:00
165 lines
3.5 KiB
TypeScript
165 lines
3.5 KiB
TypeScript
import * as path from 'path';
|
|
import * as fs from 'fs';
|
|
import { ArgvType } from './module.app-args';
|
|
import { workingDir } from './module.cfg-loader';
|
|
|
|
export const archiveFile = path.join(workingDir, 'config', 'archive.json');
|
|
|
|
export type ItemType = {
|
|
id: string;
|
|
already: string[];
|
|
}[];
|
|
|
|
export type DataType = {
|
|
hidive: {
|
|
s: ItemType;
|
|
};
|
|
adn: {
|
|
s: ItemType;
|
|
};
|
|
crunchy: {
|
|
srz: ItemType;
|
|
s: ItemType;
|
|
};
|
|
};
|
|
|
|
const addToArchive = (
|
|
kind:
|
|
| {
|
|
service: 'crunchy';
|
|
type: 's' | 'srz';
|
|
}
|
|
| {
|
|
service: 'hidive';
|
|
type: 's';
|
|
}
|
|
| {
|
|
service: 'adn';
|
|
type: 's';
|
|
},
|
|
ID: string
|
|
) => {
|
|
const data = loadData();
|
|
|
|
if (Object.prototype.hasOwnProperty.call(data, kind.service)) {
|
|
const items = kind.service === 'crunchy' ? data[kind.service][kind.type] : data[kind.service][kind.type];
|
|
if (items.findIndex((a) => a.id === ID) >= 0)
|
|
// Prevent duplicate
|
|
return;
|
|
items.push({
|
|
id: ID,
|
|
already: []
|
|
});
|
|
(data as any)[kind.service][kind.type] = items;
|
|
} else {
|
|
if (kind.service === 'crunchy') {
|
|
data['crunchy'] = {
|
|
s: ([] as ItemType).concat(
|
|
kind.type === 's'
|
|
? {
|
|
id: ID,
|
|
already: [] as string[]
|
|
}
|
|
: []
|
|
),
|
|
srz: ([] as ItemType).concat(
|
|
kind.type === 'srz'
|
|
? {
|
|
id: ID,
|
|
already: [] as string[]
|
|
}
|
|
: []
|
|
)
|
|
};
|
|
} else if (kind.service === 'adn') {
|
|
data['adn'] = {
|
|
s: [
|
|
{
|
|
id: ID,
|
|
already: []
|
|
}
|
|
]
|
|
};
|
|
} else {
|
|
data['hidive'] = {
|
|
s: [
|
|
{
|
|
id: ID,
|
|
already: []
|
|
}
|
|
]
|
|
};
|
|
}
|
|
}
|
|
fs.writeFileSync(archiveFile, JSON.stringify(data, null, 4));
|
|
};
|
|
|
|
const downloaded = (
|
|
kind:
|
|
| {
|
|
service: 'crunchy';
|
|
type: 's' | 'srz';
|
|
}
|
|
| {
|
|
service: 'hidive';
|
|
type: 's';
|
|
}
|
|
| {
|
|
service: 'adn';
|
|
type: 's';
|
|
},
|
|
ID: string,
|
|
episode: string[]
|
|
) => {
|
|
let data = loadData();
|
|
if (
|
|
!Object.prototype.hasOwnProperty.call(data, kind.service) ||
|
|
!Object.prototype.hasOwnProperty.call(data[kind.service], kind.type) ||
|
|
!Object.prototype.hasOwnProperty.call((data as any)[kind.service][kind.type], ID)
|
|
) {
|
|
addToArchive(kind, ID);
|
|
data = loadData(); // Load updated version
|
|
}
|
|
|
|
const archivedata = kind.service == 'crunchy' ? data[kind.service][kind.type] : data[kind.service][kind.type];
|
|
const alreadyData = archivedata.find((a) => a.id === ID)?.already;
|
|
for (const ep of episode) {
|
|
if (alreadyData?.includes(ep)) continue;
|
|
alreadyData?.push(ep);
|
|
}
|
|
fs.writeFileSync(archiveFile, JSON.stringify(data, null, 4));
|
|
};
|
|
|
|
const makeCommand = (service: 'crunchy' | 'hidive' | 'adn'): Partial<ArgvType>[] => {
|
|
const data = loadData();
|
|
const ret: Partial<ArgvType>[] = [];
|
|
const kind = data[service];
|
|
for (const type of Object.keys(kind)) {
|
|
const item = kind[type as 's']; // 'srz' is also possible but will be ignored for the compiler
|
|
item.forEach((i) =>
|
|
ret.push({
|
|
but: true,
|
|
all: false,
|
|
service,
|
|
e: i.already.join(','),
|
|
...(type === 's'
|
|
? {
|
|
s: i.id,
|
|
series: undefined
|
|
}
|
|
: {
|
|
series: i.id,
|
|
s: undefined
|
|
})
|
|
})
|
|
);
|
|
}
|
|
return ret;
|
|
};
|
|
|
|
const loadData = (): DataType => {
|
|
if (fs.existsSync(archiveFile)) return JSON.parse(fs.readFileSync(archiveFile).toString()) as DataType;
|
|
return {} as DataType;
|
|
};
|
|
|
|
export { addToArchive, downloaded, makeCommand };
|