lordwelch 6fab6022d0 Remove grab
Switch to using bootstrap-table
Add DownThemAll plugin
Remove Firefox plugin
2021-01-09 16:36:18 -08:00

150 lines
4.2 KiB
TypeScript

"use strict";
// License: MIT
import { TYPE_LINK, TYPE_MEDIA } from "./constants";
import { filters } from "./filters";
import { Prefs } from "./prefs";
import { lazy } from "./util";
// eslint-disable-next-line no-unused-vars
import { Item, makeUniqueItems, BaseItem } from "./item";
import { getManager } from "./manager/man";
import { select } from "./select";
import { single } from "./single";
import { Notification } from "./notifications";
import { MASK, FASTFILTER, SUBFOLDER } from "./recentlist";
import { openManager } from "./windowutils";
import { _ } from "./i18n";
const MAX_BATCH = 10000;
export interface QueueOptions {
mask?: string;
subfolder?: string;
paused?: boolean;
}
export const API = new class APIImpl {
async filter(arr: BaseItem[], type: number) {
return await (await filters()).filterItemsByType(arr, type);
}
async queue(items: BaseItem[], options: QueueOptions) {
await Promise.all([MASK.init(), SUBFOLDER.init()]);
const {mask = MASK.current} = options;
const {subfolder = SUBFOLDER.current} = options;
const {paused = false} = options;
const defaults: any = {
_idx: 0,
get idx() {
return ++this._idx;
},
referrer: null,
usableReferrer: null,
fileName: null,
title: "",
description: "",
startDate: new Date(),
private: false,
postData: null,
mask,
subfolder,
date: Date.now(),
paused
};
let currentBatch = await Prefs.get("currentBatch", 0);
const initialBatch = currentBatch;
lazy(defaults, "batch", () => {
if (++currentBatch >= MAX_BATCH) {
currentBatch = 0;
}
return currentBatch;
});
items = items.map(i => {
delete i.idx;
return new Item(i, defaults);
});
if (!items) {
return;
}
if (initialBatch !== currentBatch) {
await Prefs.set("currentBatch", currentBatch);
}
const manager = await getManager();
await manager.addNewDownloads(items);
if (await Prefs.get("queue-notification")) {
if (items.length === 1) {
new Notification(null, _("queued-download"));
}
else {
new Notification(null, _("queued-downloads", items.length));
}
}
if (await Prefs.get("open-manager-on-queue")) {
await openManager(false);
}
}
sanity(links: BaseItem[], media: BaseItem[]) {
if (!links.length && !media.length) {
new Notification(null, _("no-links"));
return false;
}
return true;
}
async turbo(links: BaseItem[], media: BaseItem[]) {
if (!this.sanity(links, media)) {
return false;
}
const type = await Prefs.get("last-type", "links");
const items = await (async () => {
if (type === "links") {
return await API.filter(links, TYPE_LINK);
}
return await API.filter(media, TYPE_MEDIA);
})();
const selected = makeUniqueItems([items]);
if (!selected.length) {
return await this.regular(links, media);
}
return await this.queue(selected, {paused: await Prefs.get("add-paused")});
}
async regularInternal(selected: BaseItem[], options: any) {
if (options.mask && !options.maskOnce) {
await MASK.init();
await MASK.push(options.mask);
}
if (typeof options.fast === "string" && !options.fastOnce) {
await FASTFILTER.init();
await FASTFILTER.push(options.fast);
}
if (typeof options.subfolder === "string" && !options.subfolderOnce) {
await SUBFOLDER.init();
await SUBFOLDER.push(options.subfolder);
}
if (typeof options.type === "string") {
await Prefs.set("last-type", options.type);
}
return await this.queue(selected, options);
}
async regular(links: BaseItem[], media: BaseItem[]) {
if (!this.sanity(links, media)) {
return false;
}
const {items, options} = await select(links, media);
return this.regularInternal(items, options);
}
async singleTurbo(item: BaseItem) {
return await this.queue([item], {paused: await Prefs.get("add-paused")});
}
async singleRegular(item: BaseItem | null) {
const {items, options} = await single(item);
return this.regularInternal(items, options);
}
}();