mirror of
https://github.com/knightcrawler-stremio/knightcrawler.git
synced 2024-12-20 03:29:51 +00:00
[addon] check rd cached torrents in chunks
This commit is contained in:
7
addon/moch/mochHelper.js
Normal file
7
addon/moch/mochHelper.js
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
function chunkArray(arr, size) {
|
||||||
|
return arr.length > size
|
||||||
|
? [arr.slice(0, size), ...chunkArray(arr.slice(size), size)]
|
||||||
|
: [arr];
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { chunkArray }
|
||||||
@@ -4,12 +4,11 @@ const { isVideo, isArchive } = require('../lib/extension');
|
|||||||
const delay = require('./delay');
|
const delay = require('./delay');
|
||||||
const StaticResponse = require('./static');
|
const StaticResponse = require('./static');
|
||||||
const { getMagnetLink } = require('../lib/magnetHelper');
|
const { getMagnetLink } = require('../lib/magnetHelper');
|
||||||
|
const { chunkArray } = require('./mochHelper');
|
||||||
|
|
||||||
const MIN_SIZE = 5 * 1024 * 1024; // 5 MB
|
const MIN_SIZE = 5 * 1024 * 1024; // 5 MB
|
||||||
const CATALOG_MAX_PAGE = 5;
|
const CATALOG_MAX_PAGE = 5;
|
||||||
const CATALOG_PAGE_SIZE = 100;
|
const CATALOG_PAGE_SIZE = 100;
|
||||||
const DNS_FAILED_MESSAGE = 'ERR_DNS_FAIL';
|
|
||||||
const BLACKLIST_ERRORS = ['ENOTFOUND', 'ETIMEDOUT', DNS_FAILED_MESSAGE];
|
|
||||||
const NON_BLACKLIST_ERRORS = ['ESOCKETTIMEDOUT', 'EAI_AGAIN'];
|
const NON_BLACKLIST_ERRORS = ['ESOCKETTIMEDOUT', 'EAI_AGAIN'];
|
||||||
const KEY = "realdebrid"
|
const KEY = "realdebrid"
|
||||||
|
|
||||||
@@ -32,23 +31,16 @@ async function getCachedStreams(streams, apiKey) {
|
|||||||
async function _getInstantAvailable(hashes, apiKey, retries = 3) {
|
async function _getInstantAvailable(hashes, apiKey, retries = 3) {
|
||||||
const options = await getDefaultOptions();
|
const options = await getDefaultOptions();
|
||||||
const RD = new RealDebridClient(apiKey, options);
|
const RD = new RealDebridClient(apiKey, options);
|
||||||
return RD.torrents.instantAvailability(hashes)
|
const hashBatches = chunkArray(hashes, 150)
|
||||||
|
return Promise.all(hashBatches.map(batch => RD.torrents.instantAvailability(batch)
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (typeof response !== 'object') {
|
if (typeof response !== 'object') {
|
||||||
if (response.includes(DNS_FAILED_MESSAGE)) {
|
|
||||||
return Promise.reject({ message: DNS_FAILED_MESSAGE });
|
|
||||||
} else if (retries > 0) {
|
|
||||||
return _getInstantAvailable(hashes, apiKey, retries - 1);
|
|
||||||
} else {
|
|
||||||
return Promise.reject(new Error('RD returned non JSON response: ' + response));
|
return Promise.reject(new Error('RD returned non JSON response: ' + response));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return response;
|
return response;
|
||||||
})
|
})))
|
||||||
|
.then(results => results.reduce((all, result) => Object.assign(all, result), {}))
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
if (retries > 0 && BLACKLIST_ERRORS.some(v => error.message && error.message.includes(v))) {
|
|
||||||
return _getInstantAvailable(hashes, apiKey, retries - 1);
|
|
||||||
}
|
|
||||||
if (retries > 0 && NON_BLACKLIST_ERRORS.some(v => error.message && error.message.includes(v))) {
|
if (retries > 0 && NON_BLACKLIST_ERRORS.some(v => error.message && error.message.includes(v))) {
|
||||||
return _getInstantAvailable(hashes, apiKey, retries - 1);
|
return _getInstantAvailable(hashes, apiKey, retries - 1);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user