cross-seed 6.11.2 → 6.12.0-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/action.js +339 -222
- package/dist/action.js.map +1 -1
- package/dist/clients/Deluge.js +100 -55
- package/dist/clients/Deluge.js.map +1 -1
- package/dist/clients/QBittorrent.js +147 -50
- package/dist/clients/QBittorrent.js.map +1 -1
- package/dist/clients/RTorrent.js +86 -56
- package/dist/clients/RTorrent.js.map +1 -1
- package/dist/clients/TorrentClient.js +60 -28
- package/dist/clients/TorrentClient.js.map +1 -1
- package/dist/clients/Transmission.js +67 -33
- package/dist/clients/Transmission.js.map +1 -1
- package/dist/cmd.js +10 -13
- package/dist/cmd.js.map +1 -1
- package/dist/config.template.cjs +17 -29
- package/dist/config.template.cjs.map +1 -1
- package/dist/configSchema.js +104 -30
- package/dist/configSchema.js.map +1 -1
- package/dist/configuration.js.map +1 -1
- package/dist/constants.js +2 -1
- package/dist/constants.js.map +1 -1
- package/dist/dataFiles.js +14 -11
- package/dist/dataFiles.js.map +1 -1
- package/dist/db.js +10 -7
- package/dist/db.js.map +1 -1
- package/dist/decide.js +13 -16
- package/dist/decide.js.map +1 -1
- package/dist/diff.js +5 -26
- package/dist/diff.js.map +1 -1
- package/dist/inject.js +99 -98
- package/dist/inject.js.map +1 -1
- package/dist/logger.js +26 -15
- package/dist/logger.js.map +1 -1
- package/dist/pipeline.js +127 -75
- package/dist/pipeline.js.map +1 -1
- package/dist/preFilter.js +2 -35
- package/dist/preFilter.js.map +1 -1
- package/dist/pushNotifier.js +3 -0
- package/dist/pushNotifier.js.map +1 -1
- package/dist/runtimeConfig.js.map +1 -1
- package/dist/searchee.js +136 -91
- package/dist/searchee.js.map +1 -1
- package/dist/startup.js +3 -2
- package/dist/startup.js.map +1 -1
- package/dist/torrent.js +132 -98
- package/dist/torrent.js.map +1 -1
- package/dist/torznab.js +5 -5
- package/dist/torznab.js.map +1 -1
- package/dist/utils.js +26 -6
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
| @@ -9,7 +9,7 @@ import { resultOf, resultOfErr } from "../Result.js"; | |
| 9 9 | 
             
            import { getRuntimeConfig } from "../runtimeConfig.js";
         | 
| 10 10 | 
             
            import { createSearcheeFromDB, parseTitle, updateSearcheeClientDB, } from "../searchee.js";
         | 
| 11 11 | 
             
            import { getMaxRemainingBytes, getResumeStopTime, organizeTrackers, resumeErrSleepTime, resumeSleepTime, shouldRecheck, } from "./TorrentClient.js";
         | 
| 12 | 
            -
            import { extractCredentialsFromUrl, extractInt, getLogString, humanReadableSize, sanitizeInfoHash, wait, } from "../utils.js";
         | 
| 12 | 
            +
            import { extractCredentialsFromUrl, extractInt, getPathParts, getLogString, humanReadableSize, sanitizeInfoHash, wait, } from "../utils.js";
         | 
| 13 13 | 
             
            const X_WWW_FORM_URLENCODED = {
         | 
| 14 14 | 
             
                "Content-Type": "application/x-www-form-urlencoded",
         | 
| 15 15 | 
             
            };
         | 
| @@ -18,10 +18,19 @@ export default class QBittorrent { | |
| 18 18 | 
             
                url;
         | 
| 19 19 | 
             
                version;
         | 
| 20 20 | 
             
                versionMajor;
         | 
| 21 | 
            -
                 | 
| 22 | 
            -
                 | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 21 | 
            +
                versionMinor;
         | 
| 22 | 
            +
                versionPatch;
         | 
| 23 | 
            +
                clientHost;
         | 
| 24 | 
            +
                clientPriority;
         | 
| 25 | 
            +
                clientType = Label.QBITTORRENT;
         | 
| 26 | 
            +
                readonly;
         | 
| 27 | 
            +
                label;
         | 
| 28 | 
            +
                constructor(url, priority, readonly) {
         | 
| 29 | 
            +
                    this.clientHost = new URL(url).host;
         | 
| 30 | 
            +
                    this.clientPriority = priority;
         | 
| 31 | 
            +
                    this.readonly = readonly;
         | 
| 32 | 
            +
                    this.label = `${this.clientType}@${this.clientHost}`;
         | 
| 33 | 
            +
                    this.url = extractCredentialsFromUrl(url, "/api/v2").unwrapOrThrow(new CrossSeedError(`[${this.label}] qBittorrent url must be percent-encoded`));
         | 
| 25 34 | 
             
                }
         | 
| 26 35 | 
             
                async login() {
         | 
| 27 36 | 
             
                    let response;
         | 
| @@ -49,23 +58,38 @@ export default class QBittorrent { | |
| 49 58 | 
             
                    }
         | 
| 50 59 | 
             
                    this.version = version;
         | 
| 51 60 | 
             
                    this.versionMajor = extractInt(this.version);
         | 
| 61 | 
            +
                    this.versionMinor = extractInt(this.version.split(".")[1]);
         | 
| 62 | 
            +
                    this.versionPatch = extractInt(this.version.split(".")[2]);
         | 
| 63 | 
            +
                    if (this.versionMajor < 4 ||
         | 
| 64 | 
            +
                        (this.versionMajor === 4 && this.versionMinor < 3) ||
         | 
| 65 | 
            +
                        (this.versionMajor === 4 &&
         | 
| 66 | 
            +
                            this.versionMinor === 3 &&
         | 
| 67 | 
            +
                            this.versionPatch < 1)) {
         | 
| 68 | 
            +
                        throw new CrossSeedError(`qBittorrent minimum supported version is v4.3.1, current version is ${this.version}`);
         | 
| 69 | 
            +
                    }
         | 
| 52 70 | 
             
                    logger.info({
         | 
| 53 | 
            -
                        label:  | 
| 54 | 
            -
                        message: `Logged in to  | 
| 71 | 
            +
                        label: this.label,
         | 
| 72 | 
            +
                        message: `Logged in to ${this.version} successfully${this.readonly ? " (readonly)" : ""}`,
         | 
| 55 73 | 
             
                    });
         | 
| 56 74 | 
             
                }
         | 
| 57 75 | 
             
                async validateConfig() {
         | 
| 58 76 | 
             
                    const { torrentDir } = getRuntimeConfig();
         | 
| 59 | 
            -
                     | 
| 77 | 
            +
                    try {
         | 
| 78 | 
            +
                        await this.login();
         | 
| 79 | 
            +
                    }
         | 
| 80 | 
            +
                    catch (e) {
         | 
| 81 | 
            +
                        e.message = `[${this.label}] ${e.message}`;
         | 
| 82 | 
            +
                        throw e;
         | 
| 83 | 
            +
                    }
         | 
| 60 84 | 
             
                    await this.createTag();
         | 
| 61 85 | 
             
                    if (!torrentDir)
         | 
| 62 86 | 
             
                        return;
         | 
| 63 87 | 
             
                    const { resume_data_storage_type } = await this.getPreferences();
         | 
| 64 88 | 
             
                    if (resume_data_storage_type === "SQLite") {
         | 
| 65 | 
            -
                        throw new CrossSeedError( | 
| 89 | 
            +
                        throw new CrossSeedError(`[${this.label}] torrentDir is not compatible with SQLite mode in qBittorrent, use https://www.cross-seed.org/docs/basics/options#useclienttorrents`);
         | 
| 66 90 | 
             
                    }
         | 
| 67 91 | 
             
                    if (!readdirSync(torrentDir).some((f) => f.endsWith(".fastresume"))) {
         | 
| 68 | 
            -
                        throw new CrossSeedError( | 
| 92 | 
            +
                        throw new CrossSeedError(`[${this.label}] Invalid torrentDir, if no torrents are in client set to null for now: https://www.cross-seed.org/docs/basics/options#torrentdir`);
         | 
| 69 93 | 
             
                    }
         | 
| 70 94 | 
             
                }
         | 
| 71 95 | 
             
                async request(path, body, headers = {}, retries = 3) {
         | 
| @@ -73,7 +97,7 @@ export default class QBittorrent { | |
| 73 97 | 
             
                        ? JSON.stringify(Object.fromEntries(body))
         | 
| 74 98 | 
             
                        : JSON.stringify(body).replace(/(?:hashes=)([a-z0-9]{40})/i, (match, hash) => match.replace(hash, sanitizeInfoHash(hash)));
         | 
| 75 99 | 
             
                    logger.verbose({
         | 
| 76 | 
            -
                        label:  | 
| 100 | 
            +
                        label: this.label,
         | 
| 77 101 | 
             
                        message: `Making request (${retries}) to ${path} with body ${bodyStr}`,
         | 
| 78 102 | 
             
                    });
         | 
| 79 103 | 
             
                    let response;
         | 
| @@ -85,7 +109,7 @@ export default class QBittorrent { | |
| 85 109 | 
             
                        });
         | 
| 86 110 | 
             
                        if (response.status === 403 && retries > 0) {
         | 
| 87 111 | 
             
                            logger.verbose({
         | 
| 88 | 
            -
                                label:  | 
| 112 | 
            +
                                label: this.label,
         | 
| 89 113 | 
             
                                message: "Received 403 from API. Logging in again and retrying",
         | 
| 90 114 | 
             
                            });
         | 
| 91 115 | 
             
                            await this.login();
         | 
| @@ -95,13 +119,13 @@ export default class QBittorrent { | |
| 95 119 | 
             
                    catch (e) {
         | 
| 96 120 | 
             
                        if (retries > 0) {
         | 
| 97 121 | 
             
                            logger.verbose({
         | 
| 98 | 
            -
                                label:  | 
| 122 | 
            +
                                label: this.label,
         | 
| 99 123 | 
             
                                message: `Request failed, ${retries} retries remaining: ${e.message}`,
         | 
| 100 124 | 
             
                            });
         | 
| 101 125 | 
             
                            return this.request(path, body, headers, retries - 1);
         | 
| 102 126 | 
             
                        }
         | 
| 103 127 | 
             
                        logger.verbose({
         | 
| 104 | 
            -
                            label:  | 
| 128 | 
            +
                            label: this.label,
         | 
| 105 129 | 
             
                            message: `Request failed after ${retries} retries: ${e.message}`,
         | 
| 106 130 | 
             
                        });
         | 
| 107 131 | 
             
                    }
         | 
| @@ -110,12 +134,20 @@ export default class QBittorrent { | |
| 110 134 | 
             
                async getPreferences() {
         | 
| 111 135 | 
             
                    const responseText = await this.request("/app/preferences", "", X_WWW_FORM_URLENCODED);
         | 
| 112 136 | 
             
                    if (!responseText) {
         | 
| 113 | 
            -
                        throw new CrossSeedError(`qBittorrent failed to retrieve preferences`);
         | 
| 137 | 
            +
                        throw new CrossSeedError(`[${this.label}] qBittorrent failed to retrieve preferences`);
         | 
| 114 138 | 
             
                    }
         | 
| 115 139 | 
             
                    return JSON.parse(responseText);
         | 
| 116 140 | 
             
                }
         | 
| 117 | 
            -
                 | 
| 118 | 
            -
             | 
| 141 | 
            +
                /**
         | 
| 142 | 
            +
                 * Always returns "Original" for API searchees due to isSubfolderContentLayout.
         | 
| 143 | 
            +
                 * This is not an issue since it's either a MATCH or we are linking.
         | 
| 144 | 
            +
                 * @param searchee the Searchee the match was sourced from
         | 
| 145 | 
            +
                 * @param searcheeInfo the torrent info from the searchee
         | 
| 146 | 
            +
                 * @param destinationDir the destinationDir for the new torrent
         | 
| 147 | 
            +
                 * @returns the layout to use for the new torrent
         | 
| 148 | 
            +
                 */
         | 
| 149 | 
            +
                getLayoutForNewTorrent(searchee, searcheeInfo, destinationDir) {
         | 
| 150 | 
            +
                    return destinationDir
         | 
| 119 151 | 
             
                        ? "Original"
         | 
| 120 152 | 
             
                        : this.isSubfolderContentLayout(searchee, searcheeInfo)
         | 
| 121 153 | 
             
                            ? "Subfolder"
         | 
| @@ -145,10 +177,10 @@ export default class QBittorrent { | |
| 145 177 | 
             
                    }
         | 
| 146 178 | 
             
                    return dupeCategory;
         | 
| 147 179 | 
             
                }
         | 
| 148 | 
            -
                getTagsForNewTorrent(searcheeInfo,  | 
| 180 | 
            +
                getTagsForNewTorrent(searcheeInfo, destinationDir) {
         | 
| 149 181 | 
             
                    const { duplicateCategories, linkCategory } = getRuntimeConfig();
         | 
| 150 | 
            -
                    if (!duplicateCategories || !searcheeInfo || ! | 
| 151 | 
            -
                        return TORRENT_TAG; // Require  | 
| 182 | 
            +
                    if (!duplicateCategories || !searcheeInfo || !destinationDir) {
         | 
| 183 | 
            +
                        return TORRENT_TAG; // Require destinationDir to duplicate category using tags
         | 
| 152 184 | 
             
                    }
         | 
| 153 185 | 
             
                    const searcheeCategory = searcheeInfo.category;
         | 
| 154 186 | 
             
                    if (!searcheeCategory.length || searcheeCategory === linkCategory) {
         | 
| @@ -184,7 +216,7 @@ export default class QBittorrent { | |
| 184 216 | 
             
                        }));
         | 
| 185 217 | 
             
                    }
         | 
| 186 218 | 
             
                    catch (e) {
         | 
| 187 | 
            -
                        logger.debug(e);
         | 
| 219 | 
            +
                        logger.debug({ label: this.label, message: e });
         | 
| 188 220 | 
             
                        return null;
         | 
| 189 221 | 
             
                    }
         | 
| 190 222 | 
             
                }
         | 
| @@ -196,7 +228,7 @@ export default class QBittorrent { | |
| 196 228 | 
             
                        return organizeTrackers(JSON.parse(responseText));
         | 
| 197 229 | 
             
                    }
         | 
| 198 230 | 
             
                    catch (e) {
         | 
| 199 | 
            -
                        logger.debug(e);
         | 
| 231 | 
            +
                        logger.debug({ label: this.label, message: e });
         | 
| 200 232 | 
             
                        return null;
         | 
| 201 233 | 
             
                    }
         | 
| 202 234 | 
             
                }
         | 
| @@ -213,11 +245,20 @@ export default class QBittorrent { | |
| 213 245 | 
             
                 * @return either a string containing the path or a error mesage
         | 
| 214 246 | 
             
                 */
         | 
| 215 247 | 
             
                async getDownloadDir(meta, options) {
         | 
| 248 | 
            +
                    const { torrentDir } = getRuntimeConfig();
         | 
| 216 249 | 
             
                    try {
         | 
| 217 250 | 
             
                        const torrentInfo = await this.getTorrentInfo(meta.infoHash);
         | 
| 218 251 | 
             
                        if (!torrentInfo) {
         | 
| 219 252 | 
             
                            return resultOfErr("NOT_FOUND");
         | 
| 220 253 | 
             
                        }
         | 
| 254 | 
            +
                        if (torrentDir &&
         | 
| 255 | 
            +
                            this.isNoSubfolderContentLayout(meta, torrentInfo)) {
         | 
| 256 | 
            +
                            logger.error({
         | 
| 257 | 
            +
                                label: this.label,
         | 
| 258 | 
            +
                                message: `NoSubfolder content layout is not supported with torrentDir, use https://www.cross-seed.org/docs/basics/options#useclienttorrents: ${torrentInfo.name} [${sanitizeInfoHash(torrentInfo.hash)}]`,
         | 
| 259 | 
            +
                            });
         | 
| 260 | 
            +
                            return resultOfErr("INVALID_DATA");
         | 
| 261 | 
            +
                        }
         | 
| 221 262 | 
             
                        if (options.onlyCompleted &&
         | 
| 222 263 | 
             
                            !this.isTorrentInfoComplete(torrentInfo)) {
         | 
| 223 264 | 
             
                            return resultOfErr("TORRENT_NOT_COMPLETE");
         | 
| @@ -225,7 +266,7 @@ export default class QBittorrent { | |
| 225 266 | 
             
                        return resultOf(this.getCorrectSavePath(meta, torrentInfo));
         | 
| 226 267 | 
             
                    }
         | 
| 227 268 | 
             
                    catch (e) {
         | 
| 228 | 
            -
                        logger.debug(e);
         | 
| 269 | 
            +
                        logger.debug({ label: this.label, message: e });
         | 
| 229 270 | 
             
                        if (e.message.includes("retrieve")) {
         | 
| 230 271 | 
             
                            return resultOfErr("NOT_FOUND");
         | 
| 231 272 | 
             
                        }
         | 
| @@ -237,6 +278,7 @@ export default class QBittorrent { | |
| 237 278 | 
             
                 * @return a map of infohash to path
         | 
| 238 279 | 
             
                 */
         | 
| 239 280 | 
             
                async getAllDownloadDirs(options) {
         | 
| 281 | 
            +
                    const { torrentDir } = getRuntimeConfig();
         | 
| 240 282 | 
             
                    const torrents = await this.getAllTorrentInfo();
         | 
| 241 283 | 
             
                    const torrentSavePaths = new Map();
         | 
| 242 284 | 
             
                    const infoHashMetaMap = options.metas.reduce((acc, meta) => {
         | 
| @@ -244,15 +286,20 @@ export default class QBittorrent { | |
| 244 286 | 
             
                        return acc;
         | 
| 245 287 | 
             
                    }, new Map());
         | 
| 246 288 | 
             
                    for (const torrent of torrents) {
         | 
| 247 | 
            -
                        if (options.onlyCompleted && !this.isTorrentInfoComplete(torrent)) {
         | 
| 248 | 
            -
                            continue;
         | 
| 249 | 
            -
                        }
         | 
| 250 289 | 
             
                        const meta = infoHashMetaMap.get(torrent.hash) ||
         | 
| 251 290 | 
             
                            (torrent.infohash_v2 &&
         | 
| 252 291 | 
             
                                infoHashMetaMap.get(torrent.infohash_v2)) ||
         | 
| 253 292 | 
             
                            (torrent.infohash_v1 &&
         | 
| 254 293 | 
             
                                infoHashMetaMap.get(torrent.infohash_v1)) ||
         | 
| 255 294 | 
             
                            undefined;
         | 
| 295 | 
            +
                        if (torrentDir &&
         | 
| 296 | 
            +
                            meta &&
         | 
| 297 | 
            +
                            this.isNoSubfolderContentLayout(meta, torrent)) {
         | 
| 298 | 
            +
                            throw new CrossSeedError(`[${this.label}] NoSubfolder content layout is not supported with torrentDir, use https://www.cross-seed.org/docs/basics/options#useclienttorrents: ${torrent.name} [${sanitizeInfoHash(torrent.hash)}]`);
         | 
| 299 | 
            +
                        }
         | 
| 300 | 
            +
                        if (options.onlyCompleted && !this.isTorrentInfoComplete(torrent)) {
         | 
| 301 | 
            +
                            continue;
         | 
| 302 | 
            +
                        }
         | 
| 256 303 | 
             
                        const savePath = meta
         | 
| 257 304 | 
             
                            ? this.getCorrectSavePath(meta, torrent)
         | 
| 258 305 | 
             
                            : torrent.save_path;
         | 
| @@ -346,7 +393,7 @@ export default class QBittorrent { | |
| 346 393 | 
             
                    const torrents = await this.getAllTorrentInfo();
         | 
| 347 394 | 
             
                    if (!torrents.length) {
         | 
| 348 395 | 
             
                        logger.error({
         | 
| 349 | 
            -
                            label:  | 
| 396 | 
            +
                            label: this.label,
         | 
| 350 397 | 
             
                            message: "No torrents found in client",
         | 
| 351 398 | 
             
                        });
         | 
| 352 399 | 
             
                        return { searchees, newSearchees };
         | 
| @@ -356,6 +403,7 @@ export default class QBittorrent { | |
| 356 403 | 
             
                        infoHashes.add(infoHash);
         | 
| 357 404 | 
             
                        const dbTorrent = await memDB("torrent")
         | 
| 358 405 | 
             
                            .where("info_hash", infoHash)
         | 
| 406 | 
            +
                            .where("client_host", this.clientHost)
         | 
| 359 407 | 
             
                            .first();
         | 
| 360 408 | 
             
                        const refresh = options?.refresh === undefined
         | 
| 361 409 | 
             
                            ? false
         | 
| @@ -371,14 +419,14 @@ export default class QBittorrent { | |
| 371 419 | 
             
                        const files = await this.getFiles(torrent.hash);
         | 
| 372 420 | 
             
                        if (!files) {
         | 
| 373 421 | 
             
                            logger.verbose({
         | 
| 374 | 
            -
                                label:  | 
| 422 | 
            +
                                label: this.label,
         | 
| 375 423 | 
             
                                message: `Failed to get files for ${torrent.name} [${sanitizeInfoHash(torrent.hash)}] (likely transient)`,
         | 
| 376 424 | 
             
                            });
         | 
| 377 425 | 
             
                            continue;
         | 
| 378 426 | 
             
                        }
         | 
| 379 427 | 
             
                        if (!files.length) {
         | 
| 380 428 | 
             
                            logger.verbose({
         | 
| 381 | 
            -
                                label:  | 
| 429 | 
            +
                                label: this.label,
         | 
| 382 430 | 
             
                                message: `No files found for ${torrent.name} [${sanitizeInfoHash(torrent.hash)}]: skipping`,
         | 
| 383 431 | 
             
                            });
         | 
| 384 432 | 
             
                            continue;
         | 
| @@ -386,7 +434,7 @@ export default class QBittorrent { | |
| 386 434 | 
             
                        const trackers = await this.getTrackers(torrent.hash);
         | 
| 387 435 | 
             
                        if (!trackers) {
         | 
| 388 436 | 
             
                            logger.verbose({
         | 
| 389 | 
            -
                                label:  | 
| 437 | 
            +
                                label: this.label,
         | 
| 390 438 | 
             
                                message: `Failed to get trackers for ${torrent.name} [${sanitizeInfoHash(torrent.hash)}] (likely transient)`,
         | 
| 391 439 | 
             
                            });
         | 
| 392 440 | 
             
                            continue;
         | 
| @@ -396,13 +444,14 @@ export default class QBittorrent { | |
| 396 444 | 
             
                        const length = torrent.total_size;
         | 
| 397 445 | 
             
                        const savePath = torrent.save_path;
         | 
| 398 446 | 
             
                        const category = torrent.category;
         | 
| 399 | 
            -
                        const tags = torrent.tags.length ? torrent.tags.split(",") : [];
         | 
| 447 | 
            +
                        const tags = torrent.tags.length ? torrent.tags.split(", ") : [];
         | 
| 400 448 | 
             
                        const searchee = {
         | 
| 401 449 | 
             
                            infoHash,
         | 
| 402 450 | 
             
                            name,
         | 
| 403 451 | 
             
                            title,
         | 
| 404 452 | 
             
                            files,
         | 
| 405 453 | 
             
                            length,
         | 
| 454 | 
            +
                            clientHost: this.clientHost,
         | 
| 406 455 | 
             
                            savePath,
         | 
| 407 456 | 
             
                            category,
         | 
| 408 457 | 
             
                            tags,
         | 
| @@ -411,7 +460,7 @@ export default class QBittorrent { | |
| 411 460 | 
             
                        newSearchees.push(searchee);
         | 
| 412 461 | 
             
                        searchees.push(searchee);
         | 
| 413 462 | 
             
                    }
         | 
| 414 | 
            -
                    await updateSearcheeClientDB(newSearchees, infoHashes);
         | 
| 463 | 
            +
                    await updateSearcheeClientDB(this.clientHost, newSearchees, infoHashes);
         | 
| 415 464 | 
             
                    return { searchees, newSearchees };
         | 
| 416 465 | 
             
                }
         | 
| 417 466 | 
             
                /**
         | 
| @@ -420,11 +469,20 @@ export default class QBittorrent { | |
| 420 469 | 
             
                 */
         | 
| 421 470 | 
             
                async isTorrentComplete(infoHash) {
         | 
| 422 471 | 
             
                    const torrentInfo = await this.getTorrentInfo(infoHash);
         | 
| 423 | 
            -
                    if (!torrentInfo) | 
| 472 | 
            +
                    if (!torrentInfo)
         | 
| 424 473 | 
             
                        return resultOfErr("NOT_FOUND");
         | 
| 425 | 
            -
                    }
         | 
| 426 474 | 
             
                    return resultOf(this.isTorrentInfoComplete(torrentInfo));
         | 
| 427 475 | 
             
                }
         | 
| 476 | 
            +
                /**
         | 
| 477 | 
            +
                 * @param infoHash the infohash of the torrent
         | 
| 478 | 
            +
                 * @returns whether the torrent is checking
         | 
| 479 | 
            +
                 */
         | 
| 480 | 
            +
                async isTorrentChecking(infoHash) {
         | 
| 481 | 
            +
                    const torrentInfo = await this.getTorrentInfo(infoHash);
         | 
| 482 | 
            +
                    if (!torrentInfo)
         | 
| 483 | 
            +
                        return resultOfErr("NOT_FOUND");
         | 
| 484 | 
            +
                    return resultOf(["checkingDL", "checkingUP"].includes(torrentInfo.state));
         | 
| 485 | 
            +
                }
         | 
| 428 486 | 
             
                isTorrentInfoComplete(torrentInfo) {
         | 
| 429 487 | 
             
                    return [
         | 
| 430 488 | 
             
                        "uploading",
         | 
| @@ -436,10 +494,19 @@ export default class QBittorrent { | |
| 436 494 | 
             
                        "forcedUP",
         | 
| 437 495 | 
             
                    ].includes(torrentInfo.state);
         | 
| 438 496 | 
             
                }
         | 
| 497 | 
            +
                /**
         | 
| 498 | 
            +
                 * This can only return true if the searchee is from a torrent file, not API.
         | 
| 499 | 
            +
                 * Since we get the file structure from the API, it's already accounted for.
         | 
| 500 | 
            +
                 * This does NOT check if the torrent was added with "Don't Create Subfolder".
         | 
| 501 | 
            +
                 * @param data the Searchee or Metafile
         | 
| 502 | 
            +
                 * @param dataInfo the TorrentInfo
         | 
| 503 | 
            +
                 * @returns whether the torrent was added with "Create Subfolder"
         | 
| 504 | 
            +
                 */
         | 
| 439 505 | 
             
                isSubfolderContentLayout(data, dataInfo) {
         | 
| 440 | 
            -
                     | 
| 506 | 
            +
                    const { useClientTorrents } = getRuntimeConfig();
         | 
| 507 | 
            +
                    if (useClientTorrents)
         | 
| 441 508 | 
             
                        return false;
         | 
| 442 | 
            -
                    if ( | 
| 509 | 
            +
                    if (data.files.length > 1)
         | 
| 443 510 | 
             
                        return false;
         | 
| 444 511 | 
             
                    let dirname = path.posix.dirname;
         | 
| 445 512 | 
             
                    let resolve = path.posix.resolve;
         | 
| @@ -447,9 +514,38 @@ export default class QBittorrent { | |
| 447 514 | 
             
                        dirname = path.win32.dirname;
         | 
| 448 515 | 
             
                        resolve = path.win32.resolve;
         | 
| 449 516 | 
             
                    }
         | 
| 517 | 
            +
                    if (dirname(data.files[0].path) !== ".")
         | 
| 518 | 
            +
                        return false;
         | 
| 450 519 | 
             
                    return (resolve(dirname(dataInfo.content_path)) !==
         | 
| 451 520 | 
             
                        resolve(dataInfo.save_path));
         | 
| 452 521 | 
             
                }
         | 
| 522 | 
            +
                /**
         | 
| 523 | 
            +
                 * This can only return true if the searchee is from a torrent file, not API.
         | 
| 524 | 
            +
                 * Since we get the file structure from the API, it's already accounted for.
         | 
| 525 | 
            +
                 * This does NOT check if the torrent was added with "Create Subfolder".
         | 
| 526 | 
            +
                 * @param data the Searchee or Metafile
         | 
| 527 | 
            +
                 * @param dataInfo the TorrentInfo
         | 
| 528 | 
            +
                 * @returns whether the torrent was added with "Don't Create Subfolder"
         | 
| 529 | 
            +
                 */
         | 
| 530 | 
            +
                isNoSubfolderContentLayout(data, dataInfo) {
         | 
| 531 | 
            +
                    const { useClientTorrents } = getRuntimeConfig();
         | 
| 532 | 
            +
                    if (useClientTorrents)
         | 
| 533 | 
            +
                        return false;
         | 
| 534 | 
            +
                    if (data.files.length > 1) {
         | 
| 535 | 
            +
                        return dataInfo.content_path === dataInfo.save_path;
         | 
| 536 | 
            +
                    }
         | 
| 537 | 
            +
                    let dirname = path.posix.dirname;
         | 
| 538 | 
            +
                    let relative = path.posix.relative;
         | 
| 539 | 
            +
                    if (ABS_WIN_PATH_REGEX.test(dataInfo.content_path)) {
         | 
| 540 | 
            +
                        dirname = path.win32.dirname;
         | 
| 541 | 
            +
                        relative = path.win32.relative;
         | 
| 542 | 
            +
                    }
         | 
| 543 | 
            +
                    if (dirname(data.files[0].path) === ".")
         | 
| 544 | 
            +
                        return false;
         | 
| 545 | 
            +
                    const clientPath = relative(dataInfo.save_path, dataInfo.content_path);
         | 
| 546 | 
            +
                    return (getPathParts(clientPath, dirname).length <
         | 
| 547 | 
            +
                        getPathParts(data.files[0].path, dirname).length);
         | 
| 548 | 
            +
                }
         | 
| 453 549 | 
             
                async resumeInjection(infoHash, decision, options) {
         | 
| 454 550 | 
             
                    let sleepTime = resumeSleepTime;
         | 
| 455 551 | 
             
                    const maxRemainingBytes = getMaxRemainingBytes(decision);
         | 
| @@ -473,31 +569,31 @@ export default class QBittorrent { | |
| 473 569 | 
             
                        const torrentLog = `${torrentInfo.name} [${sanitizeInfoHash(infoHash)}]`;
         | 
| 474 570 | 
             
                        if (!["pausedDL", "stoppedDL", "pausedUP", "stoppedUP"].includes(torrentInfo.state)) {
         | 
| 475 571 | 
             
                            logger.warn({
         | 
| 476 | 
            -
                                label:  | 
| 572 | 
            +
                                label: this.label,
         | 
| 477 573 | 
             
                                message: `Will not resume ${torrentLog}: state is ${torrentInfo.state}`,
         | 
| 478 574 | 
             
                            });
         | 
| 479 575 | 
             
                            return;
         | 
| 480 576 | 
             
                        }
         | 
| 481 577 | 
             
                        if (torrentInfo.amount_left > maxRemainingBytes) {
         | 
| 482 578 | 
             
                            logger.warn({
         | 
| 483 | 
            -
                                label:  | 
| 579 | 
            +
                                label: this.label,
         | 
| 484 580 | 
             
                                message: `Will not resume ${torrentLog}: ${humanReadableSize(torrentInfo.amount_left, { binary: true })} remaining > ${humanReadableSize(maxRemainingBytes, { binary: true })}`,
         | 
| 485 581 | 
             
                            });
         | 
| 486 582 | 
             
                            return;
         | 
| 487 583 | 
             
                        }
         | 
| 488 584 | 
             
                        logger.info({
         | 
| 489 | 
            -
                            label:  | 
| 585 | 
            +
                            label: this.label,
         | 
| 490 586 | 
             
                            message: `Resuming ${torrentLog}: ${humanReadableSize(torrentInfo.amount_left, { binary: true })} remaining`,
         | 
| 491 587 | 
             
                        });
         | 
| 492 588 | 
             
                        await this.request(`/torrents/${this.versionMajor >= 5 ? "start" : "resume"}`, `hashes=${infoHash}`, X_WWW_FORM_URLENCODED);
         | 
| 493 589 | 
             
                        return;
         | 
| 494 590 | 
             
                    }
         | 
| 495 591 | 
             
                    logger.warn({
         | 
| 496 | 
            -
                        label:  | 
| 592 | 
            +
                        label: this.label,
         | 
| 497 593 | 
             
                        message: `Will not resume torrent ${infoHash}: timeout`,
         | 
| 498 594 | 
             
                    });
         | 
| 499 595 | 
             
                }
         | 
| 500 | 
            -
                async inject(newTorrent, searchee, decision,  | 
| 596 | 
            +
                async inject(newTorrent, searchee, decision, options) {
         | 
| 501 597 | 
             
                    const { linkCategory } = getRuntimeConfig();
         | 
| 502 598 | 
             
                    try {
         | 
| 503 599 | 
             
                        if (await this.getTorrentInfo(newTorrent.infoHash)) {
         | 
| @@ -505,20 +601,20 @@ export default class QBittorrent { | |
| 505 601 | 
             
                        }
         | 
| 506 602 | 
             
                        const searcheeInfo = await this.getTorrentInfo(searchee.infoHash);
         | 
| 507 603 | 
             
                        if (!searcheeInfo) {
         | 
| 508 | 
            -
                            if (! | 
| 604 | 
            +
                            if (!options.destinationDir) {
         | 
| 509 605 | 
             
                                // This is never possible, being made explicit here
         | 
| 510 606 | 
             
                                throw new Error(`Searchee torrent may have been deleted: ${getLogString(searchee)}`);
         | 
| 511 607 | 
             
                            }
         | 
| 512 608 | 
             
                            else if (searchee.infoHash) {
         | 
| 513 609 | 
             
                                logger.warn({
         | 
| 514 | 
            -
                                    label:  | 
| 610 | 
            +
                                    label: this.label,
         | 
| 515 611 | 
             
                                    message: `Searchee torrent may have been deleted, tagging may not meet expectations: ${getLogString(searchee)}`,
         | 
| 516 612 | 
             
                                });
         | 
| 517 613 | 
             
                            }
         | 
| 518 614 | 
             
                        }
         | 
| 519 | 
            -
                        const { savePath, isComplete, autoTMM, category } =  | 
| 615 | 
            +
                        const { savePath, isComplete, autoTMM, category } = options.destinationDir
         | 
| 520 616 | 
             
                            ? {
         | 
| 521 | 
            -
                                savePath:  | 
| 617 | 
            +
                                savePath: options.destinationDir,
         | 
| 522 618 | 
             
                                isComplete: true,
         | 
| 523 619 | 
             
                                autoTMM: false,
         | 
| 524 620 | 
             
                                category: linkCategory,
         | 
| @@ -529,8 +625,9 @@ export default class QBittorrent { | |
| 529 625 | 
             
                                autoTMM: searcheeInfo.auto_tmm,
         | 
| 530 626 | 
             
                                category: searcheeInfo.category,
         | 
| 531 627 | 
             
                            };
         | 
| 532 | 
            -
                        if (!isComplete)
         | 
| 628 | 
            +
                        if (options.onlyCompleted && !isComplete) {
         | 
| 533 629 | 
             
                            return InjectionResult.TORRENT_NOT_COMPLETE;
         | 
| 630 | 
            +
                        }
         | 
| 534 631 | 
             
                        const filename = `${newTorrent.getFileSystemSafeName()}.${TORRENT_TAG}.torrent`;
         | 
| 535 632 | 
             
                        const buffer = new Blob([newTorrent.encode()], {
         | 
| 536 633 | 
             
                            type: "application/x-bittorrent",
         | 
| @@ -547,8 +644,8 @@ export default class QBittorrent { | |
| 547 644 | 
             
                        if (category?.length) {
         | 
| 548 645 | 
             
                            formData.append("category", await this.getCategoryForNewTorrent(category, savePath, autoTMM));
         | 
| 549 646 | 
             
                        }
         | 
| 550 | 
            -
                        formData.append("tags", this.getTagsForNewTorrent(searcheeInfo,  | 
| 551 | 
            -
                        formData.append("contentLayout", this.getLayoutForNewTorrent(searchee, searcheeInfo,  | 
| 647 | 
            +
                        formData.append("tags", this.getTagsForNewTorrent(searcheeInfo, options.destinationDir));
         | 
| 648 | 
            +
                        formData.append("contentLayout", this.getLayoutForNewTorrent(searchee, searcheeInfo, options.destinationDir));
         | 
| 552 649 | 
             
                        formData.append("skip_checking", (!toRecheck).toString());
         | 
| 553 650 | 
             
                        formData.append(this.versionMajor >= 5 ? "stopped" : "paused", toRecheck.toString());
         | 
| 554 651 | 
             
                        // for some reason the parser parses the last kv pair incorrectly
         | 
| @@ -559,7 +656,7 @@ export default class QBittorrent { | |
| 559 656 | 
             
                        }
         | 
| 560 657 | 
             
                        catch (e) {
         | 
| 561 658 | 
             
                            logger.error({
         | 
| 562 | 
            -
                                label:  | 
| 659 | 
            +
                                label: this.label,
         | 
| 563 660 | 
             
                                message: `Failed to add torrent (polling client to confirm): ${e.message}`,
         | 
| 564 661 | 
             
                            });
         | 
| 565 662 | 
             
                            logger.debug(e);
         | 
| @@ -578,7 +675,7 @@ export default class QBittorrent { | |
| 578 675 | 
             
                    }
         | 
| 579 676 | 
             
                    catch (e) {
         | 
| 580 677 | 
             
                        logger.error({
         | 
| 581 | 
            -
                            label:  | 
| 678 | 
            +
                            label: this.label,
         | 
| 582 679 | 
             
                            message: `Injection failed for ${getLogString(newTorrent)}: ${e.message}`,
         | 
| 583 680 | 
             
                        });
         | 
| 584 681 | 
             
                        logger.debug(e);
         | 
| @@ -1 +1 @@ | |
| 1 | 
            -
            {"version":3,"file":"QBittorrent.js","sourceRoot":"","sources":["../../src/clients/QBittorrent.ts"],"names":[],"mappings":"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"}
         | 
| 1 | 
            +
            {"version":3,"file":"QBittorrent.js","sourceRoot":"","sources":["../../src/clients/QBittorrent.ts"],"names":[],"mappings":"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"}
         |