UNPKG

@subtitles/providers

Version:

Providers are the core of applications, where the subtitles are collected. Each provider exports a unique strategy for gathering data. From legendastv's web scraping from opensubtitle API usage, you can collect subtitles from your favorite tv shows and mo

90 lines (89 loc) 4.03 kB
"use strict"; var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var _OpenSubtitleProvider_os, _OpenSubtitleProvider_authenticated; Object.defineProperty(exports, "__esModule", { value: true }); const debug_1 = __importDefault(require("debug")); // eslint-disable-next-line @typescript-eslint/ban-ts-comment //@ts-ignore const opensubtitles_api_1 = __importDefault(require("opensubtitles-api")); const debug = (0, debug_1.default)('providers:opensubtitles'); function scraper(subtitle) { const { lang, url, downloads, id, filename, date } = subtitle; return { id, title: filename, releasedAt: new Date(date), source: url, language: lang, downloads: +downloads, provider: 'opensubtitles.org', }; } class OpenSubtitleProvider { constructor(username, password) { _OpenSubtitleProvider_os.set(this, void 0); _OpenSubtitleProvider_authenticated.set(this, void 0); __classPrivateFieldSet(this, _OpenSubtitleProvider_os, new opensubtitles_api_1.default({ username, password, useragent: 'UserAgent', ssl: true, }), "f"); __classPrivateFieldSet(this, _OpenSubtitleProvider_authenticated, false, "f"); } get authenticated() { return __classPrivateFieldGet(this, _OpenSubtitleProvider_authenticated, "f"); } async authenticate() { debug('logging to OpenSubtitles'); try { await __classPrivateFieldGet(this, _OpenSubtitleProvider_os, "f").login(); debug('successfully logged in'); __classPrivateFieldSet(this, _OpenSubtitleProvider_authenticated, true, "f"); return true; } catch (error) { debug('failed to trying to login'); __classPrivateFieldSet(this, _OpenSubtitleProvider_authenticated, false, "f"); throw error; } } async search({ keyword }) { const subtitles = []; if (!this.authenticated) return subtitles; const results = await __classPrivateFieldGet(this, _OpenSubtitleProvider_os, "f").search({ sublanguageid: ['pob'].join(), query: keyword, gzip: true, limit: 10, }); for (const language in results) { const langResults = results[language]; debug('found language %s', language); debug('found subtitle(s) %O', langResults); if (Array.isArray(langResults)) { subtitles.push(...langResults.map(scraper)); } else { subtitles.push(scraper(langResults)); } } return subtitles; } } exports.default = OpenSubtitleProvider; _OpenSubtitleProvider_os = new WeakMap(), _OpenSubtitleProvider_authenticated = new WeakMap();