diff --git a/addon/moch/moch.js b/addon/moch/moch.js index 9db12e1..6c18439 100644 --- a/addon/moch/moch.js +++ b/addon/moch/moch.js @@ -9,7 +9,7 @@ const putio = require('./putio'); const StaticResponse = require('./static'); const { cacheWrapResolvedUrl } = require('../lib/cache'); const { timeout } = require('../lib/promises'); -const { BadTokenError, streamFilename } = require('./mochHelper'); +const { BadTokenError, streamFilename, AccessDeniedError } = require('./mochHelper'); const RESOLVE_TIMEOUT = 2 * 60 * 1000; // 2 minutes const MIN_API_KEY_SYMBOLS = 15; @@ -136,9 +136,11 @@ async function getMochItemMeta(mochKey, itemId, config) { } function processMochResults(streams, config, results) { - const errorResults = results.filter(result => result && result.error === BadTokenError); + const errorResults = results + .map(result => errorStreamResponse(result.moch.key, result.error)) + .filter(errorResponse => errorResponse); if (errorResults.length) { - return errorResults.map(result => badTokenStreamResponse(result.moch.key)) + return errorResults; } const includeTorrentLinks = options.includeTorrentLinks(config); @@ -194,12 +196,22 @@ function blackListToken(token, mochKey) { TOKEN_BLACKLIST.push(tokenKey); } -function badTokenStreamResponse(mochKey) { - return { - name: `Torrentio\n${MOCHS[mochKey].shortName} error`, - title: `Invalid ${MOCHS[mochKey].name} ApiKey/Token!`, - url: StaticResponse.FAILED_ACCESS - }; +function errorStreamResponse(mochKey, error) { + if (error === BadTokenError) { + return { + name: `Torrentio\n${MOCHS[mochKey].shortName} error`, + title: `Invalid ${MOCHS[mochKey].name} ApiKey/Token!`, + url: StaticResponse.FAILED_ACCESS + }; + } + if (error === AccessDeniedError) { + return { + name: `Torrentio\n${MOCHS[mochKey].shortName} error`, + title: `Expired ${MOCHS[mochKey].name} subscription!`, + url: StaticResponse.FAILED_ACCESS + }; + } + return undefined; } module.exports = { applyMochs, getMochCatalog, getMochItemMeta, resolve, MochOptions: MOCHS } diff --git a/addon/moch/mochHelper.js b/addon/moch/mochHelper.js index 2deb52f..a17104b 100644 --- a/addon/moch/mochHelper.js +++ b/addon/moch/mochHelper.js @@ -1,4 +1,5 @@ const BadTokenError = { code: 'BAD_TOKEN' } +const AccessDeniedError = { code: 'ACCESS_DENIED' } function chunkArray(arr, size) { return arr.length > size @@ -15,4 +16,4 @@ function streamFilename(stream) { return encodeURIComponent(filename) } -module.exports = { chunkArray, BadTokenError, streamFilename } +module.exports = { chunkArray, streamFilename, BadTokenError, AccessDeniedError } diff --git a/addon/moch/realdebrid.js b/addon/moch/realdebrid.js index e2aae26..19ff37b 100644 --- a/addon/moch/realdebrid.js +++ b/addon/moch/realdebrid.js @@ -5,7 +5,7 @@ const { delay } = require('../lib/promises'); const { cacheAvailabilityResults, getCachedAvailabilityResults } = require('../lib/cache'); const StaticResponse = require('./static'); const { getMagnetLink } = require('../lib/magnetHelper'); -const { chunkArray, BadTokenError } = require('./mochHelper'); +const { chunkArray, BadTokenError, AccessDeniedError } = require('./mochHelper'); const MIN_SIZE = 5 * 1024 * 1024; // 5 MB const CATALOG_MAX_PAGE = 5; @@ -52,6 +52,9 @@ async function _getInstantAvailable(hashes, apiKey, retries = 3, maxChunkSize = if (error && error.code === 8) { return Promise.reject(BadTokenError); } + if (error && accessDeniedError(error)) { + return Promise.reject(AccessDeniedError); + } if (!error && maxChunkSize !== 1) { // sometimes due to large response size RD responds with an empty body. Reduce chunk size to reduce body console.log(`Reducing chunk size for availability request: ${hashes[0]}`);