{"version":3,"sources":["jsdelivr-header.js","/npm/trakt.tv@8.1.1/trakt.js"],"names":[],"mappings":"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","file":"/npm/trakt.tv@8.1.1/trakt.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/trakt.tv@8.1.1/trakt.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict';\r\n\r\n// requirejs modules\r\nconst got = require('got');\r\nconst crypto = require('crypto');\r\nconst methods = require('./methods.json');\r\nconst pkg = require('./package.json');\r\n\r\n// default settings\r\nconst defaultUrl = 'https://api.trakt.tv';\r\nconst redirectUrn = 'urn:ietf:wg:oauth:2.0:oob';\r\nconst defaultUa = `${pkg.name}/${pkg.version} (NodeJS; +${pkg.repository.url})`;\r\n\r\nmodule.exports = class Trakt {\r\n    constructor(settings = {}, debug) {\r\n        if (!settings.client_id) throw Error('Missing client_id');\r\n\r\n        this._authentication = {};\r\n        this._settings = {\r\n            client_id: settings.client_id,\r\n            client_secret: settings.client_secret,\r\n            redirect_uri: settings.redirect_uri || redirectUrn,\r\n            debug: settings.debug || debug,\r\n            endpoint: settings.api_url || defaultUrl,\r\n            pagination: settings.pagination,\r\n            useragent: settings.useragent || defaultUa\r\n        };\r\n\r\n        this._construct();\r\n\r\n        settings.plugins && this._plugins(settings.plugins, settings.options);\r\n    }\r\n\r\n    // Creates methods for all requests\r\n    _construct() {\r\n        for (let url in methods) {\r\n            const urlParts = url.split('/');\r\n            const name = urlParts.pop(); // key for function\r\n\r\n            let tmp = this;\r\n            for (let p = 1; p < urlParts.length; ++p) { // acts like mkdir -p\r\n                tmp = tmp[urlParts[p]] || (tmp[urlParts[p]] = {});\r\n            }\r\n\r\n            tmp[name] = (() => {\r\n                const method = methods[url]; // closure forces copy\r\n                return (params) => {\r\n                    return this._call(method, params);\r\n                };\r\n            })();\r\n        }\r\n\r\n        this._debug(`Trakt.tv: module loaded, as ${this._settings.useragent}`);\r\n    }\r\n\r\n    // Initialize plugins\r\n    _plugins(plugins, options = {}) {\r\n        for (let name in plugins) {\r\n            if (!plugins.hasOwnProperty(name)) continue;\r\n\r\n            this[name] = plugins[name];\r\n            this[name].init(this, (options[name] || {}));\r\n            this._debug(`Trakt.tv: ${name} plugin loaded`);\r\n        }\r\n    }\r\n\r\n    // Debug & Print\r\n    _debug(req) {\r\n        this._settings.debug && console.log(req.method ? `${req.method}: ${req.url}` : req);\r\n    }\r\n\r\n    // Authentication calls\r\n    _exchange(str) {\r\n        const req = {\r\n            method: 'POST',\r\n            url: `${this._settings.endpoint}/oauth/token`,\r\n            headers: {\r\n                'User-Agent': this._settings.useragent,\r\n                'Content-Type': 'application/json'\r\n            },\r\n            body: JSON.stringify(str)\r\n        };\r\n\r\n        this._debug(req);\r\n        return got(req).then(response => {\r\n            const body = JSON.parse(response.body);\r\n\r\n            this._authentication.refresh_token = body.refresh_token;\r\n            this._authentication.access_token = body.access_token;\r\n            this._authentication.expires = (body.created_at + body.expires_in) * 1000;\r\n\r\n            return body;\r\n        }).catch(error => {\r\n            throw (error.response && error.response.statusCode == 401) ? Error(error.response.headers['www-authenticate']) : error;\r\n        });\r\n    }\r\n\r\n    // De-authentication POST\r\n    _revoke() {\r\n        const req = {\r\n            method: 'POST',\r\n            url: `${this._settings.endpoint}/oauth/revoke`,\r\n            headers: {\r\n                'User-Agent': this._settings.useragent,\r\n                'Content-Type': 'application/json'\r\n            },\r\n            body: JSON.stringify({\r\n                token: this._authentication.access_token,\r\n                client_id: this._settings.client_id,\r\n                client_secret: this._settings.client_secret\r\n            })\r\n        };\r\n        this._debug(req);\r\n        got(req);\r\n    }\r\n\r\n    // Get code to paste on login screen\r\n    _device_code(str, type) {\r\n        const req = {\r\n            method: 'POST',\r\n            url: `${this._settings.endpoint}/oauth/device/${type}`,\r\n            headers: {\r\n                'User-Agent': this._settings.useragent,\r\n                'Content-Type': 'application/json'\r\n            },\r\n            body: JSON.stringify(str)\r\n        };\r\n\r\n        this._debug(req);\r\n        return got(req).then(response => JSON.parse(response.body)).catch(error => {\r\n            throw (error.response && error.response.statusCode == 401) ? Error(error.response.headers['www-authenticate']) : error;\r\n        });\r\n    }\r\n\r\n    // Parse url before api call\r\n    _parse(method, params) {\r\n        if (!params) params = {};\r\n\r\n        const queryParts = [];\r\n        const pathParts = [];\r\n\r\n        // ?Part\r\n        const queryPart = method.url.split('?')[1];\r\n        if (queryPart) {\r\n            const queryParams = queryPart.split('&');\r\n            for (let i in queryParams) {\r\n                const name = queryParams[i].split('=')[0];\r\n                (params[name] || params[name] === 0) && queryParts.push(`${name}=${encodeURIComponent(params[name])}`);\r\n            }\r\n        }\r\n\r\n        // /part\r\n        const pathPart = method.url.split('?')[0];\r\n        const pathParams = pathPart.split('/');\r\n        for (let k in pathParams) {\r\n            if (pathParams[k][0] != ':') {\r\n                pathParts.push(pathParams[k]);\r\n            } else {\r\n                const param = params[pathParams[k].substr(1)];\r\n                if (param || param === 0) {\r\n                    pathParts.push(param);\r\n                } else {\r\n                    // check for missing required params\r\n                    if (method.optional && method.optional.indexOf(pathParams[k].substr(1)) === -1) throw Error(`Missing mandatory paramater: ${pathParams[k].substr(1)}`);\r\n                }\r\n            }\r\n        }\r\n\r\n        // Filters\r\n        const filters = ['query', 'years', 'genres', 'languages', 'countries', 'runtimes', 'ratings', 'certifications', 'networks', 'status'];\r\n        for (let p in params) {\r\n            filters.indexOf(p) !== -1 && queryParts.indexOf(`${p}=${encodeURIComponent(params[p])}`) === -1 && queryParts.push(`${p}=${encodeURIComponent(params[p])}`);\r\n        }\r\n\r\n        // Pagination\r\n        if (method.opts['pagination']) {\r\n            params['page'] && queryParts.push(`page=${params['page']}`);\r\n            params['limit'] && queryParts.push(`limit=${params['limit']}`);\r\n        }\r\n\r\n        // Extended\r\n        if (method.opts['extended'] && params['extended']) {            \r\n            queryParts.push(`extended=${params['extended']}`);\r\n        }\r\n\r\n        return [\r\n            this._settings.endpoint,\r\n            pathParts.join('/'),\r\n            queryParts.length ? `?${queryParts.join('&')}` : ''\r\n        ].join('');\r\n    }\r\n\r\n    // Parse methods then hit trakt\r\n    _call(method, params) {\r\n        if (method.opts['auth'] === true && (!this._authentication.access_token || !this._settings.client_secret)) throw Error('OAuth required');\r\n\r\n        const req = {\r\n            method: method.method,\r\n            url: this._parse(method, params),\r\n            headers: {\r\n                'User-Agent': this._settings.useragent,\r\n                'Content-Type': 'application/json',\r\n                'trakt-api-version': '2',\r\n                'trakt-api-key': this._settings.client_id\r\n            },\r\n            body: (method.body ? Object.assign({}, method.body) : {})\r\n        };\r\n\r\n        if (method.opts['auth'] && this._authentication.access_token) req.headers['Authorization'] = `Bearer ${this._authentication.access_token}`;\r\n\r\n        for (let k in params) {\r\n            if (k in req.body) req.body[k] = params[k];\r\n        }\r\n        for (let k in req.body) {\r\n            if (!req.body[k]) delete req.body[k];\r\n        }\r\n\r\n        if (method.method === 'GET') {\r\n            delete req.body;\r\n        } else {\r\n            req.body = JSON.stringify(req.body);\r\n        }\r\n\r\n        this._debug(req);\r\n        return got(req).then(response => this._parseResponse(method, params, response));\r\n    }\r\n\r\n    // Parse trakt response: pagination & stuff\r\n    _parseResponse (method, params, response) {\r\n        if (!response.body) return response.body;\r\n\r\n        const data = JSON.parse(response.body);\r\n        let parsed = data;\r\n\r\n        if ((params && params.pagination) || this._settings.pagination) {\r\n            parsed = {\r\n                data: data\r\n            };\r\n\r\n            if (method.opts.pagination && response.headers) {\r\n                // http headers field names are case-insensitive\r\n                let headers = JSON.parse(JSON.stringify(response.headers).toLowerCase());\r\n                \r\n                parsed.pagination = {\r\n                    'item-count': headers['x-pagination-item-count'],\r\n                    'limit': headers['x-pagination-limit'],\r\n                    'page': headers['x-pagination-page'],\r\n                    'page-count': headers['x-pagination-page-count'],\r\n                };\r\n            } else {\r\n                parsed.pagination = false;\r\n            }\r\n        }\r\n\r\n        return parsed;\r\n    }\r\n\r\n    // Get authentication url for browsers\r\n    get_url() {\r\n        this._authentication.state = crypto.randomBytes(6).toString('hex');\r\n        // Replace 'api' from the api_url to get the top level trakt domain\r\n        const base_url = this._settings.endpoint.replace(/api\\W/, '');\r\n        return `${base_url}/oauth/authorize?response_type=code&client_id=${this._settings.client_id}&redirect_uri=${this._settings.redirect_uri}&state=${this._authentication.state}`;\r\n    }\r\n\r\n    // Verify code; optional state\r\n    exchange_code(code, state) {\r\n        if (state && state != this._authentication.state) throw Error('Invalid CSRF (State)');\r\n\r\n        return this._exchange({\r\n            code: code,\r\n            client_id: this._settings.client_id,\r\n            client_secret: this._settings.client_secret,\r\n            redirect_uri: this._settings.redirect_uri,\r\n            grant_type: 'authorization_code'\r\n        });\r\n    }\r\n\r\n    // Get authentification codes for devices\r\n    get_codes() {\r\n        return this._device_code({\r\n            client_id: this._settings.client_id\r\n        }, 'code');\r\n    }\r\n\r\n    // Calling trakt on a loop until it sends back a token\r\n    poll_access(poll) {\r\n        if (!poll || (poll && poll.constructor !== Object)) throw Error('Invalid Poll object');\r\n\r\n        const begin = Date.now();\r\n\r\n        return new Promise((resolve, reject) => {\r\n            const call = () => {\r\n                if (begin + (poll.expires_in * 1000) <= Date.now()) {\r\n                    clearInterval(polling);\r\n                    return reject(Error('Expired'));\r\n                }\r\n\r\n                this._device_code({\r\n                    code: poll.device_code,\r\n                    client_id: this._settings.client_id,\r\n                    client_secret: this._settings.client_secret\r\n                }, 'token').then(body => {\r\n                    this._authentication.refresh_token = body.refresh_token;\r\n                    this._authentication.access_token = body.access_token;\r\n                    this._authentication.expires = Date.now() + (body.expires_in * 1000); // Epoch in milliseconds\r\n\r\n                    clearInterval(polling);\r\n                    resolve(body);\r\n                }).catch(error => {\r\n                    // do nothing on 400\r\n                    if (error.response && error.response.statusCode === 400) return;\r\n\r\n                    clearInterval(polling);\r\n                    reject(error);\r\n                });\r\n            };\r\n\r\n            const polling = setInterval(() => {\r\n                call();\r\n            }, (poll.interval * 1000));\r\n        });\r\n    }\r\n\r\n    // Refresh access token\r\n    refresh_token() {\r\n        return this._exchange({\r\n            refresh_token: this._authentication.refresh_token,\r\n            client_id: this._settings.client_id,\r\n            client_secret: this._settings.client_secret,\r\n            redirect_uri: this._settings.redirect_uri,\r\n            grant_type: 'refresh_token'\r\n        });\r\n    }\r\n\r\n    // Import token\r\n    import_token(token) {\r\n        this._authentication.access_token = token.access_token;\r\n        this._authentication.expires = token.expires;\r\n        this._authentication.refresh_token = token.refresh_token;\r\n\r\n        return new Promise((resolve, reject) => {\r\n            if (token.expires < Date.now()) {\r\n                this.refresh_token().then(() => resolve(this.export_token())).catch(reject);\r\n            } else {\r\n                resolve(this.export_token());\r\n            }\r\n        });\r\n    }\r\n\r\n    // Export token\r\n    export_token() {\r\n        return {\r\n            access_token: this._authentication.access_token,\r\n            expires: this._authentication.expires,\r\n            refresh_token: this._authentication.refresh_token\r\n        };\r\n    }\r\n\r\n    // Revoke token\r\n    revoke_token() {\r\n        if (this._authentication.access_token) {\r\n            this._revoke();\r\n            this._authentication = {};\r\n        }\r\n    }\r\n};\r\n"]}