From a1d39af63058746b59b6036c45c40d2b364b28ac Mon Sep 17 00:00:00 2001 From: TheBeastLT Date: Sun, 15 Mar 2020 20:37:30 +0100 Subject: [PATCH] [addon] adds custom landing page for addon configuration --- addon/addon.js | 15 +- addon/lib/configuration.js | 16 +++ addon/lib/landingTemplate.js | 268 +++++++++++++++++++++++++++++++++++ addon/lib/manifest.js | 33 +++++ addon/package-lock.json | 4 +- addon/package.json | 2 +- addon/serverless.js | 21 ++- 7 files changed, 341 insertions(+), 18 deletions(-) create mode 100644 addon/lib/configuration.js create mode 100644 addon/lib/landingTemplate.js create mode 100644 addon/lib/manifest.js diff --git a/addon/addon.js b/addon/addon.js index 9b24977..4e136ae 100644 --- a/addon/addon.js +++ b/addon/addon.js @@ -1,5 +1,6 @@ const { addonBuilder } = require('stremio-addon-sdk'); const titleParser = require('parse-torrent-title'); +const { manifest } = require('./lib/manifest'); const { toStreamInfo } = require('./lib/streamInfo'); const { cacheWrapStream } = require('./lib/cache'); const repository = require('./lib/repository'); @@ -9,19 +10,7 @@ const CACHE_MAX_AGE_EMPTY = 30 * 60; // 30 minutes const STALE_REVALIDATE_AGE = 4 * 60 * 60; // 4 hours const STALE_ERROR_AGE = 7 * 24 * 60 * 60; // 7 days -const builder = new addonBuilder({ - id: 'com.stremio.torrentio.addon', - version: '1.0.0', - name: 'Torrentio', - description: 'Provides torrent stream from scraped torrent providers. ' - + 'Currently supports ThePirateBay, 1337x, RARBG, KickassTorrents, HorribleSubs.', - catalogs: [], - resources: ['stream'], - types: ['movie', 'series'], - idPrefixes: ['tt', 'kitsu'], - background: `https://i.imgur.com/t8wVwcg.jpg`, - logo: `https://i.imgur.com/GwxAcDV.png`, -}); +const builder = new addonBuilder(manifest()); builder.defineStreamHandler((args) => { if (!args.id.match(/tt\d+/i) && !args.id.match(/kitsu:\d+/i)) { diff --git a/addon/lib/configuration.js b/addon/lib/configuration.js new file mode 100644 index 0000000..79f77cd --- /dev/null +++ b/addon/lib/configuration.js @@ -0,0 +1,16 @@ +function parseConfiguration(configuration) { + const configValues = configuration.split('|') + .reduce((map, next) => { + const parameterParts = next.split('='); + if (parameterParts.length === 2) { + map[parameterParts[0].toLowerCase()] = parameterParts[1]; + } + return map; + }, {}); + if (configValues.providers) { + configValues.providers = configValues.providers.split(',').map(provider => provider.toLowerCase()); + } + return configValues; +} + +module.exports = parseConfiguration; \ No newline at end of file diff --git a/addon/lib/landingTemplate.js b/addon/lib/landingTemplate.js new file mode 100644 index 0000000..5e044fb --- /dev/null +++ b/addon/lib/landingTemplate.js @@ -0,0 +1,268 @@ +const STYLESHEET = ` +* { + box-sizing: border-box; +} + +body, +html { + margin: 0; + padding: 0; + width: 100%; + height: 100% +} + +html { + background-size: auto 100%; + background-size: cover; + background-position: center center; + background-repeat: no-repeat +} + +body { + display: flex; + background: rgba(0, 0, 0, 0.60); + font-family: 'Open Sans', Arial, sans-serif; + color: white; +} + +h1 { + font-size: 4.5vh; + font-weight: 700; +} + +h2 { + font-size: 2.2vh; + font-weight: normal; + font-style: italic; + opacity: 0.8; +} + +h3 { + font-size: 2.2vh; +} + +h1, +h2, +h3, +p, +label { + margin: 0; + text-shadow: 0 0 1vh rgba(0, 0, 0, 0.15); +} + +p { + font-size: 1.75vh; +} + +ul { + font-size: 1.75vh; + margin: 0; + margin-top: 1vh; + padding-left: 3vh; +} + +a { + color: white +} + +a.install-link { + text-decoration: none +} + +button { + border: 0; + outline: 0; + color: white; + background: #8A5AAB; + padding: 1.2vh 3.5vh; + margin: auto; + text-align: center; + font-family: 'Open Sans', Arial, sans-serif; + font-size: 2.2vh; + font-weight: 600; + cursor: pointer; + display: block; + box-shadow: 0 0.5vh 1vh rgba(0, 0, 0, 0.2); + transition: box-shadow 0.1s ease-in-out; +} + +button:hover { + box-shadow: none; +} + +button:active { + box-shadow: 0 0 0 0.5vh white inset; +} + +#addon { + width: 40vh; + margin: auto; +} + +.logo { + height: 14vh; + width: 14vh; + margin: auto; + margin-bottom: 3vh; +} + +.logo img { + width: 100%; +} + +.name, .version { + display: inline-block; + vertical-align: top; +} + +.name { + line-height: 5vh; +} + +.version { + position: absolute; + line-height: 5vh; + margin-left: 1vh; + opacity: 0.8; +} + +.contact { + position: absolute; + left: 0; + bottom: 4vh; + width: 100%; + text-align: center; +} + +.contact a { + font-size: 1.4vh; + font-style: italic; +} + +.separator { + margin-bottom: 4vh; +} + +.label { + font-size: 2.2vh; + font-weight: 600; + padding: 0; + line-height: inherit; +} + +.btn-group, .multiselect-container { + width: 100%; +} + +.multiselect-container { + border: 0; + border-radius: 0; +} + +.input, .btn { + height: 3.5vh; + width: 100%; + margin: auto; + padding: 6px 12px; + border: 0; + border-radius: 0; + outline: 0; + color: #333; + box-shadow: 0 0.5vh 1vh rgba(0, 0, 0, 0.2); +} +`; +const { Providers } = require('./manifest'); + +function landingTemplate(manifest, providers = [], realDebridApiKey = '') { + console.log(providers); + console.log(realDebridApiKey); + const background = manifest.background || 'https://dl.strem.io/addon-background.jpg'; + const logo = manifest.logo || 'https://dl.strem.io/addon-logo.png'; + const contactHTML = manifest.contactEmail ? + `
+

Contact ${manifest.name} creator:

+ ${manifest.contactEmail} +
` : ''; + const providersHTML = Providers + .map(provider => ``) + .join('\n'); + const stylizedTypes = manifest.types + .map(t => t[0].toUpperCase() + t.slice(1) + (t !== 'series' ? 's' : '')); + + return ` + + + + + + ${manifest.name} - Stremio Addon + + + + + + + + + + + +
+ +

${manifest.name}

+

${manifest.version || '0.0.0'}

+

${manifest.description || ''}

+ +
+ +

This addon has more :

+ + +
+ + + + + + + +
+ + + + + ${contactHTML} +
+ + + + ` +} + +module.exports = landingTemplate; \ No newline at end of file diff --git a/addon/lib/manifest.js b/addon/lib/manifest.js new file mode 100644 index 0000000..f49ce6e --- /dev/null +++ b/addon/lib/manifest.js @@ -0,0 +1,33 @@ +const Providers = [ + 'ThePirateBay', + 'RARBG', + '1337x', + 'KickassTorrents', + 'HorribleSubs' +]; + +function manifest(providers, realDebridApiKey) { + const providersList = Array.isArray(providers) && providers.map(provider => getProvider(provider)) || Providers; + const providersDesc = providers && providers.length ? 'Enabled providers -' : 'Currently supports'; + const realDebridDesc = realDebridApiKey ? ' and RealdDebrid enabled' : ''; + return { + id: 'com.stremio.torrentio.addon', + version: '0.0.1-beta', + name: 'Torrentio', + description: '[BETA] Provides torrent streams from scraped torrent providers.' + + ` ${providersDesc} ${providersList.join(', ')}${realDebridDesc}.` + + ' To configure visit www.torrentio.now.sh', + catalogs: [], + resources: ['stream'], + types: ['movie', 'series'], + idPrefixes: ['tt', 'kitsu'], + background: `https://i.ibb.co/VtSfFP9/t8wVwcg.jpg`, + logo: `https://i.ibb.co/w4BnkC9/GwxAcDV.png`, + } +} + +function getProvider(configProvider) { + return Providers.find(provider => provider.toLowerCase() === configProvider); +} + +module.exports = { manifest, Providers }; \ No newline at end of file diff --git a/addon/package-lock.json b/addon/package-lock.json index 7950b99..9fb83c0 100644 --- a/addon/package-lock.json +++ b/addon/package-lock.json @@ -1363,8 +1363,8 @@ } }, "parse-torrent-title": { - "version": "git://github.com/TheBeastLT/parse-torrent-title.git#90c60ab3edab3a40843160ba1bdf4995c4b5cc56", - "from": "git://github.com/TheBeastLT/parse-torrent-title.git#master", + "version": "git://github.com/TheBeastLT/parse-torrent-title.git#7c00602bc1c405f5574758eeabb72b133fea81d5", + "from": "git://github.com/TheBeastLT/parse-torrent-title.git#7c00602bc1c405f5574758eeabb72b133fea81d5", "requires": { "moment": "^2.24.0" } diff --git a/addon/package.json b/addon/package.json index c71f3ee..292e3fa 100644 --- a/addon/package.json +++ b/addon/package.json @@ -11,7 +11,7 @@ "cache-manager": "^2.9.0", "cache-manager-mongodb": "^0.2.1", "express-rate-limit": "^5.1.1", - "parse-torrent-title": "git://github.com/TheBeastLT/parse-torrent-title.git#master", + "parse-torrent-title": "git://github.com/TheBeastLT/parse-torrent-title.git#7c00602bc1c405f5574758eeabb72b133fea81d5", "pg": "^7.8.2", "pg-hstore": "^2.3.2", "sequelize": "^4.43.0", diff --git a/addon/serverless.js b/addon/serverless.js index 2ef61a1..10018a0 100644 --- a/addon/serverless.js +++ b/addon/serverless.js @@ -1,7 +1,9 @@ const rateLimit = require('express-rate-limit'); const { getRouter } = require('stremio-addon-sdk'); -const landingTemplate = require('stremio-addon-sdk/src/landingTemplate'); const addonInterface = require('./addon'); +const { manifest } = require('./lib/manifest'); +const parseConfiguration = require('./lib/configuration'); +const landingTemplate = require('./lib/landingTemplate'); const router = getRouter(addonInterface); const limiter = rateLimit({ @@ -13,11 +15,26 @@ const limiter = rateLimit({ router.use(limiter); router.get('/', (_, res) => { - const landingHTML = landingTemplate(addonInterface.manifest); + const landingHTML = landingTemplate(manifest()); res.setHeader('content-type', 'text/html'); res.end(landingHTML); }); +router.get('/:configuration', (req, res) => { + const configValues = parseConfiguration(req.params.configuration); + console.log(configValues); + const landingHTML = landingTemplate(manifest(), configValues.providers, configValues.realdebrid); + res.setHeader('content-type', 'text/html'); + res.end(landingHTML); +}); + +router.get('/:configuration/manifest.json', (req, res) => { + const configValues = parseConfiguration(req.params.configuration); + const manifestBuf = JSON.stringify(manifest(configValues.providers, configValues.realdebrid)); + res.setHeader('Content-Type', 'application/json; charset=utf-8'); + res.end(manifestBuf) +}); + module.exports = function (req, res) { router(req, res, function () { res.statusCode = 404;