diff --git a/addon/lib/landingTemplate.js b/addon/lib/landingTemplate.js index 66b0742..8006539 100644 --- a/addon/lib/landingTemplate.js +++ b/addon/lib/landingTemplate.js @@ -201,6 +201,7 @@ function landingTemplate(manifest, config = {}) { const premiumizeApiKey = config[MochOptions.premiumize.key] || ''; const allDebridApiKey = config[MochOptions.alldebrid.key] || ''; const debridLinkApiKey = config[MochOptions.debridlink.key] || ''; + const offcloudApiKey = config[MochOptions.offcloud.key] || ''; const putioKey = config[MochOptions.putio.key] || ''; const putioClientId = putioKey.replace(/@.*/, ''); const putioToken = putioKey.replace(/.*@/, ''); @@ -322,6 +323,11 @@ function landingTemplate(manifest, config = {}) { +
+ + +
+
@@ -364,6 +370,7 @@ function landingTemplate(manifest, config = {}) { $('#iPremiumize').val("${premiumizeApiKey}"); $('#iAllDebrid').val("${allDebridApiKey}"); $('#iDebridLink').val("${debridLinkApiKey}"); + $('#iOffcloud').val("${offcloudApiKey}"); $('#iPutioClientId').val("${putioClientId}"); $('#iPutioToken').val("${putioToken}"); $('#iSort').val("${sort}"); @@ -389,6 +396,7 @@ function landingTemplate(manifest, config = {}) { $('#dPremiumize').toggle(provider === '${MochOptions.premiumize.key}'); $('#dAllDebrid').toggle(provider === '${MochOptions.alldebrid.key}'); $('#dDebridLink').toggle(provider === '${MochOptions.debridlink.key}'); + $('#dOffcloud').toggle(provider === '${MochOptions.offcloud.key}'); $('#dPutio').toggle(provider === '${MochOptions.putio.key}'); } @@ -404,6 +412,7 @@ function landingTemplate(manifest, config = {}) { const allDebridValue = $('#iAllDebrid').val() || ''; const debridLinkValue = $('#iDebridLink').val() || '' const premiumizeValue = $('#iPremiumize').val() || ''; + const offcloudValue = $('#iOffcloud').val() || '' const putioClientIdValue = $('#iPutioClientId').val() || ''; const putioTokenValue = $('#iPutioToken').val() || ''; @@ -419,6 +428,7 @@ function landingTemplate(manifest, config = {}) { const premiumize = premiumizeValue.length && premiumizeValue.trim(); const allDebrid = allDebridValue.length && allDebridValue.trim(); const debridLink = debridLinkValue.length && debridLinkValue.trim(); + const offcloud = offcloudValue.length && offcloudValue.trim(); const putio = putioClientIdValue.length && putioTokenValue.length && putioClientIdValue.trim() + '@' + putioTokenValue.trim(); const preConfigurations = { @@ -435,6 +445,7 @@ function landingTemplate(manifest, config = {}) { ['${MochOptions.premiumize.key}', premiumize], ['${MochOptions.alldebrid.key}', allDebrid], ['${MochOptions.debridlink.key}', debridLink], + ['${MochOptions.offcloud.key}', offcloud], ['${MochOptions.putio.key}', putio] ].filter(([_, value]) => value.length).map(([key, value]) => key + '=' + value).join('|'); configurationValue = Object.entries(preConfigurations) diff --git a/addon/moch/moch.js b/addon/moch/moch.js index d843127..fd77b72 100644 --- a/addon/moch/moch.js +++ b/addon/moch/moch.js @@ -4,6 +4,7 @@ const realdebrid = require('./realdebrid'); const premiumize = require('./premiumize'); const alldebrid = require('./alldebrid'); const debridlink = require('./debridlink'); +const offcloud = require('./offcloud'); const putio = require('./putio'); const StaticResponse = require('./static'); const { cacheWrapResolvedUrl } = require('../lib/cache'); @@ -43,6 +44,13 @@ const MOCHS = { shortName: 'DL', catalog: true }, + offcloud: { + key: 'offcloud', + instance: offcloud, + name: 'Offcloud', + shortName: 'OC', + catalog: true + }, putio: { key: 'putio', instance: putio, diff --git a/addon/moch/offcloud.js b/addon/moch/offcloud.js new file mode 100644 index 0000000..a8b5247 --- /dev/null +++ b/addon/moch/offcloud.js @@ -0,0 +1,157 @@ +const OffcloudClient = require('offcloud-api'); +const { Type } = require('../lib/types'); +const { isVideo } = require('../lib/extension'); +const StaticResponse = require('./static'); +const { getMagnetLink } = require('../lib/magnetHelper'); +const { chunkArray, BadTokenError } = require('./mochHelper'); + +const KEY = 'offcloud'; + +async function getCachedStreams(streams, apiKey) { + const options = await getDefaultOptions(); + const OC = new OffcloudClient(apiKey, options); + const hashBatches = chunkArray(streams.map(stream => stream.infoHash), 100); + const available = await Promise.all(hashBatches.map(hashes => OC.instant.cache(hashes))) + .then(results => results.map(result => result.cachedItems)) + .then(results => results.reduce((all, result) => all.concat(result), [])) + .catch(error => { + if (error === 'badToken') { + return Promise.reject(BadTokenError); + } + console.warn('Failed Offcloud cached torrent availability request:', error); + return undefined; + }); + return available && streams + .reduce((mochStreams, stream) => { + const isCached = available.includes(stream.infoHash); + const streamTitleParts = stream.title.replace(/\n👤.*/s, '').split('\n'); + const fileName = streamTitleParts[streamTitleParts.length - 1]; + const fileIndex = streamTitleParts.length === 2 ? stream.fileIdx : null; + const encodedFileName = encodeURIComponent(fileName); + mochStreams[stream.infoHash] = { + url: `${apiKey}/${stream.infoHash}/${encodedFileName}/${fileIndex}`, + cached: isCached + }; + return mochStreams; + }, {}) +} + +async function getCatalog(apiKey, offset = 0) { + if (offset > 0) { + return []; + } + const options = await getDefaultOptions(); + const OC = new OffcloudClient(apiKey, options); + return OC.cloud.history() + .then(torrents => (torrents || []) + .filter(torrent => torrent && statusReady(torrent)) + .map(torrent => ({ + id: `${KEY}:${torrent.requestId}`, + type: Type.OTHER, + name: torrent.fileName + }))); +} + +async function getItemMeta(itemId, apiKey, ip) { + const options = await getDefaultOptions(ip); + const OC = new OffcloudClient(apiKey, options); + const torrents = await OC.cloud.history(); + const torrent = torrents.find(torrent => torrent.requestId === itemId) + const createDate = torrent ? new Date(torrent.createdOn) : new Date(); + return OC.cloud.explore(itemId) + .then(files => ({ + id: `${KEY}:${itemId}`, + type: Type.OTHER, + name: torrent.name, + videos: files + .filter(file => isVideo(file)) + .map((file, index) => ({ + id: `${KEY}:${itemId}:${index}`, + title: file.split('/').pop(), + released: new Date(createDate.getTime() - index).toISOString(), + streams: [{ url: file }] + })) + })) +} + +async function resolve({ ip, apiKey, infoHash, cachedEntryInfo, fileIndex }) { + console.log(`Unrestricting Offcloud ${infoHash} [${fileIndex}]`); + const options = await getDefaultOptions(ip); + const OC = new OffcloudClient(apiKey, options); + + return _resolve(OC, infoHash, cachedEntryInfo, fileIndex) + .catch(error => { + if (errorExpiredSubscriptionError(error)) { + console.log(`Access denied to Offcloud ${infoHash} [${fileIndex}]`); + return StaticResponse.FAILED_ACCESS; + } + return Promise.reject(`Failed Offcloud adding torrent ${JSON.stringify(error)}`); + }); +} + +async function _resolve(OC, infoHash, cachedEntryInfo, fileIndex) { + const torrent = await _createOrFindTorrent(OC, infoHash); + if (torrent && statusReady(torrent)) { + return _unrestrictLink(OC, infoHash, torrent, cachedEntryInfo, fileIndex); + } else if (torrent && statusDownloading(torrent)) { + console.log(`Downloading to Offcloud ${infoHash} [${fileIndex}]...`); + return StaticResponse.DOWNLOADING; + } + + return Promise.reject(`Failed Offcloud adding torrent ${JSON.stringify(torrent)}`); +} + +async function _createOrFindTorrent(OC, infoHash) { + return _findTorrent(OC, infoHash) + .catch(() => _createTorrent(OC, infoHash)); +} + +async function _findTorrent(OC, infoHash) { + const torrents = await OC.cloud.history(); + const foundTorrents = torrents.filter(torrent => torrent.originalLink.toLowerCase().includes(infoHash)); + const nonFailedTorrent = foundTorrents.find(torrent => !statusError(torrent)); + const foundTorrent = nonFailedTorrent || foundTorrents[0]; + return foundTorrent || Promise.reject('No recent torrent found'); +} + +async function _createTorrent(OC, infoHash) { + const magnetLink = await getMagnetLink(infoHash); + const response = await OC.cloud.download(magnetLink); + return response +} + +async function _unrestrictLink(OC, infoHash, torrent, cachedEntryInfo, fileIndex) { + const targetFileName = decodeURIComponent(cachedEntryInfo); + const files = await OC.cloud.explore(torrent.requestId) + const targetFile = Number.isInteger(fileIndex) + ? files.find(file => file.includes(targetFileName)) + : files.find(file => isVideo(file)); + + if (!targetFile) { + return Promise.reject(`No Offcloud links found for index ${fileIndex} in: ${JSON.stringify(torrent)}`); + } + console.log(`Unrestricted Offcloud ${infoHash} [${fileIndex}] to ${targetFile}`); + return targetFile; +} + +async function getDefaultOptions(ip) { + return { ip, timeout: 30000 }; +} + +function statusDownloading(torrent) { + return torrent.status === 'created' +} + +function statusError(torrent) { + return torrent.status === 'error' +} + +function statusReady(torrent) { + return torrent.status === 'downloaded'; +} + +function errorExpiredSubscriptionError(error) { + return error['not_available'] != null; +} + +module.exports = { getCachedStreams, resolve, getCatalog, getItemMeta }; \ No newline at end of file diff --git a/addon/package-lock.json b/addon/package-lock.json index 7d0afda..6bfd086 100644 --- a/addon/package-lock.json +++ b/addon/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.12", "license": "MIT", "dependencies": { - "@putdotio/api-client": "^8.16.0", + "@putdotio/api-client": "^8.32.0", "all-debrid-api": "^1.1.0", "axios": "^0.21.4", "bottleneck": "^2.19.5", @@ -20,7 +20,8 @@ "https-proxy-agent": "^5.0.0", "magnet-uri": "^6.2.0", "named-queue": "^2.2.1", - "parse-torrent-title": "git://github.com/TheBeastLT/parse-torrent-title.git#eb390fcfc257950e65ec1b0812bd331765a053c9", + "offcloud-api": "^1.0.0", + "parse-torrent-title": "git://github.com/TheBeastLT/parse-torrent-title.git#e94682462d748a9ecd256a37fab98a20f0306255", "pg": "^8.7.1", "pg-hstore": "^2.3.4", "premiumize-api": "^1.0.3", @@ -59,49 +60,22 @@ } }, "node_modules/@putdotio/api-client": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@putdotio/api-client/-/api-client-8.16.0.tgz", - "integrity": "sha512-9a00sd5aArb5s1R8MBsHULP3gcRsD9ivokRUCtS3oBf8M53u9XUAx/D79sehhiWbMR20DYxwUFfSoEvM/daq3Q==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@putdotio/api-client/-/api-client-8.32.0.tgz", + "integrity": "sha512-eo4KiXIvDKpU76VK1pQitIJ6neDd81HUCoUGcH+lAtcfN+amQVp8e9cHfYeEvYMj16sr/8wONqG1GayJP2Fr4g==", "dependencies": { - "axios": "^0.19.2", + "axios": "^0.21.1", "event-emitter": "^0.3.5", "form-data": "^3.0.0", - "js-base64": "^2.6.2", - "qs": "^6.9.4", - "urijs": "^1.19.5" + "js-base64": "2.6.3", + "qs": "^6.10.3", + "urijs": "^1.19.7", + "uuid": "^8.3.2" }, "engines": { "node": ">=10" } }, - "node_modules/@putdotio/api-client/node_modules/axios": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", - "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", - "deprecated": "Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410", - "dependencies": { - "follow-redirects": "1.5.10" - } - }, - "node_modules/@putdotio/api-client/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@putdotio/api-client/node_modules/follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "dependencies": { - "debug": "=3.1.0" - }, - "engines": { - "node": ">=4.0" - } - }, "node_modules/@putdotio/api-client/node_modules/form-data": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", @@ -116,9 +90,9 @@ } }, "node_modules/@putdotio/api-client/node_modules/qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "dependencies": { "side-channel": "^1.0.4" }, @@ -129,6 +103,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/@putdotio/api-client/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -1705,9 +1687,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { "node": ">= 0.4" }, @@ -1957,9 +1939,9 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "node_modules/js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.3.tgz", + "integrity": "sha512-fiUvdfCaAXoQTHdKMgTvg6IkecXDcVz6V5rlftUTclF9IKBjMizvSdQaCl/z/6TApDeby5NL+axYou3i0mu1Pg==" }, "node_modules/js-tokens": { "version": "4.0.0", @@ -2304,13 +2286,21 @@ } }, "node_modules/object-inspect": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", - "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/offcloud-api": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/offcloud-api/-/offcloud-api-1.0.0.tgz", + "integrity": "sha512-cJNoQSl2CJHKrXHRV/+6FMFqToZs/ungdYGNQQOdSuI1FKY7Y5bEOsqlL8BuAxRMd91wKzA4xBmjvrHq5ZllEg==", + "dependencies": { + "request": "^2.83.0" + } + }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -2408,8 +2398,8 @@ }, "node_modules/parse-torrent-title": { "version": "1.3.0", - "resolved": "git+ssh://git@github.com/TheBeastLT/parse-torrent-title.git#eb390fcfc257950e65ec1b0812bd331765a053c9", - "integrity": "sha512-flPYfe/dOYzmay2ZP613A1t9SzoIJoZuqvo+/ijg9aTEjxvWbg5sbEZtsHm8qwf7KXfXJ4SjR4hIzLQ2cu/AGA==", + "resolved": "git+ssh://git@github.com/TheBeastLT/parse-torrent-title.git#e94682462d748a9ecd256a37fab98a20f0306255", + "integrity": "sha512-Kzv+mQGBc2KMS9fvXiGAmM0ztin06TJrfTvJL7rH5soFdszEMJKPCs0RmmQeYNwEZ/yprzE8RCsB2kGyNRd5Fg==", "license": "MIT", "dependencies": { "moment": "^2.24.0" @@ -3599,42 +3589,19 @@ } }, "@putdotio/api-client": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@putdotio/api-client/-/api-client-8.16.0.tgz", - "integrity": "sha512-9a00sd5aArb5s1R8MBsHULP3gcRsD9ivokRUCtS3oBf8M53u9XUAx/D79sehhiWbMR20DYxwUFfSoEvM/daq3Q==", + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@putdotio/api-client/-/api-client-8.32.0.tgz", + "integrity": "sha512-eo4KiXIvDKpU76VK1pQitIJ6neDd81HUCoUGcH+lAtcfN+amQVp8e9cHfYeEvYMj16sr/8wONqG1GayJP2Fr4g==", "requires": { - "axios": "^0.19.2", + "axios": "^0.21.1", "event-emitter": "^0.3.5", "form-data": "^3.0.0", - "js-base64": "^2.6.2", - "qs": "^6.9.4", - "urijs": "^1.19.5" + "js-base64": "2.6.3", + "qs": "^6.10.3", + "urijs": "^1.19.7", + "uuid": "^8.3.2" }, "dependencies": { - "axios": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", - "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", - "requires": { - "follow-redirects": "1.5.10" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "requires": { - "debug": "=3.1.0" - } - }, "form-data": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", @@ -3646,12 +3613,17 @@ } }, "qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "requires": { "side-channel": "^1.0.4" } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" } } }, @@ -4916,9 +4888,9 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "http-errors": { "version": "1.7.2", @@ -5118,9 +5090,9 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.3.tgz", + "integrity": "sha512-fiUvdfCaAXoQTHdKMgTvg6IkecXDcVz6V5rlftUTclF9IKBjMizvSdQaCl/z/6TApDeby5NL+axYou3i0mu1Pg==" }, "js-tokens": { "version": "4.0.0", @@ -5360,9 +5332,17 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-inspect": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", - "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "offcloud-api": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/offcloud-api/-/offcloud-api-1.0.0.tgz", + "integrity": "sha512-cJNoQSl2CJHKrXHRV/+6FMFqToZs/ungdYGNQQOdSuI1FKY7Y5bEOsqlL8BuAxRMd91wKzA4xBmjvrHq5ZllEg==", + "requires": { + "request": "^2.83.0" + } }, "on-finished": { "version": "2.3.0", @@ -5439,9 +5419,9 @@ } }, "parse-torrent-title": { - "version": "git+ssh://git@github.com/TheBeastLT/parse-torrent-title.git#eb390fcfc257950e65ec1b0812bd331765a053c9", - "integrity": "sha512-flPYfe/dOYzmay2ZP613A1t9SzoIJoZuqvo+/ijg9aTEjxvWbg5sbEZtsHm8qwf7KXfXJ4SjR4hIzLQ2cu/AGA==", - "from": "parse-torrent-title@git://github.com/TheBeastLT/parse-torrent-title.git#eb390fcfc257950e65ec1b0812bd331765a053c9", + "version": "git+ssh://git@github.com/TheBeastLT/parse-torrent-title.git#e94682462d748a9ecd256a37fab98a20f0306255", + "integrity": "sha512-Kzv+mQGBc2KMS9fvXiGAmM0ztin06TJrfTvJL7rH5soFdszEMJKPCs0RmmQeYNwEZ/yprzE8RCsB2kGyNRd5Fg==", + "from": "parse-torrent-title@git://github.com/TheBeastLT/parse-torrent-title.git#e94682462d748a9ecd256a37fab98a20f0306255", "requires": { "moment": "^2.24.0" } diff --git a/addon/package.json b/addon/package.json index 0caf2cd..a67d18a 100644 --- a/addon/package.json +++ b/addon/package.json @@ -8,7 +8,7 @@ "author": "TheBeastLT ", "license": "MIT", "dependencies": { - "@putdotio/api-client": "^8.16.0", + "@putdotio/api-client": "^8.32.0", "all-debrid-api": "^1.1.0", "axios": "^0.21.4", "bottleneck": "^2.19.5", @@ -19,7 +19,8 @@ "https-proxy-agent": "^5.0.0", "magnet-uri": "^6.2.0", "named-queue": "^2.2.1", - "parse-torrent-title": "git://github.com/TheBeastLT/parse-torrent-title.git#eb390fcfc257950e65ec1b0812bd331765a053c9", + "offcloud-api": "^1.0.0", + "parse-torrent-title": "git://github.com/TheBeastLT/parse-torrent-title.git#e94682462d748a9ecd256a37fab98a20f0306255", "pg": "^8.7.1", "pg-hstore": "^2.3.4", "premiumize-api": "^1.0.3",