UNPKG

xdl-node

Version:

A library for retrieving audio streams and other data from X Spaces, built on Node.js and TypeScript.

155 lines (154 loc) 8.15 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.XDL = void 0; const cookies_1 = require("./cookies"); const api_1 = require("./api"); const twspace_dl_1 = __importDefault(require("./twspace_dl")); const twspace_1 = require("./twspace"); class XDL { /** * Приватный конструктор – вызывается только через init() */ constructor(cookiesPath) { this._activeRecorder = null; const cookies = (0, cookies_1.loadValidCookies)(cookiesPath); console.log('Loaded cookies:', cookies); this.api = new api_1.TwitterAPI(); this.api.initApis(cookies); // Делаем API доступным глобально global.API = this.api; } /** * Инициализирует библиотеку и возвращает её инстанс. * Вызывайте один раз при старте приложения. * @param cookiesPath Путь к файлу cookies. */ static init(cookiesPath) { if (!this._instance) { this._instance = new XDL(cookiesPath); } return this._instance; } /** * Геттер для получения инстанса XDL. * Выбросит ошибку, если XDL не был инициализирован. */ static get instance() { if (!this._instance) { throw new Error("XDL не инициализирован. Сначала вызовите XDL.init(путь_к_cookies)."); } return this._instance; } /** * Скачивает Twitter Space (после окончания эфира или с реплеем). * После завершения скачивания встраивает обложку и чистит временные файлы. * @param spaceUrl URL твиттер-спейса (формат: https://x.com/i/spaces/<space_id>) * @param formatStr Шаблон имени файла (опционально) */ async downloadSpace(spaceUrl, formatStr) { const space = await twspace_1.Twspace.fromSpaceUrl(spaceUrl, this.api); const downloader = new twspace_dl_1.default(space, formatStr); console.info("Начинается скачивание Twitter Space..."); await downloader.download(); console.info("Скачивание завершено. Встраиваем обложку..."); await downloader.cleanup(); console.info("Операция успешно завершена."); } /** * Запускает live‑запись Twitter Space. * Возвращает объект, через который можно остановить запись. * @param spaceUrl URL твиттер-спейса (формат: https://x.com/i/spaces/<space_id>) * @param formatStr Шаблон имени файла (опционально) * @returns Инстанс TwspaceDL для управления записью. */ async startLiveRecording(spaceUrl, formatStr) { const space = await twspace_1.Twspace.fromSpaceUrl(spaceUrl, this.api); const downloader = new twspace_dl_1.default(space, formatStr); console.info("Запуск live‑записи Twitter Space..."); await downloader.startLiveRecording(); this._activeRecorder = downloader; return downloader; } /** * Останавливает активную live-запись Twitter Space. * Если запись не была запущена, метод ничего не делает. */ stopLiveRecording() { if (this._activeRecorder) { console.info("Остановка live‑записи Twitter Space..."); this._activeRecorder.stopLiveRecording(); this._activeRecorder = null; } else { console.warn("Нет активных live-записей для остановки."); } } /** * **Новый метод:** Получает m3u8 поток для Twitter Space без сохранения его на диск. * @param spaceUrl URL твиттер-спейса (формат: https://x.com/i/spaces/<space_id>) * @param formatStr Шаблон имени файла (опционально) * @returns Строка с содержимым m3u8 плейлиста. */ async getM3u8Stream(spaceUrl, formatStr) { const space = await twspace_1.Twspace.fromSpaceUrl(spaceUrl, this.api); const downloader = new twspace_dl_1.default(space, formatStr); return await downloader.getM3u8Stream(); } /** * **Обновленный метод:** Получает полный m3u8 плейлист без сохранения на диск * и возвращает объект с виртуальным путем и содержимым для дальнейшего использования. * @param spaceUrl URL твиттер-спейса (формат: https://x.com/i/spaces/<space_id>) * @param formatStr Шаблон имени файла (опционально) * @returns Объект с виртуальным путем и содержимым плейлиста. */ async getFullPlaylist(spaceUrl, formatStr) { const space = await twspace_1.Twspace.fromSpaceUrl(spaceUrl, this.api); const downloader = new twspace_dl_1.default(space, formatStr); const result = await downloader.getFullPlaylist(); console.info(`Получен плейлист m3u8: ${result.filePath} (размер: ${result.content.length} байт)`); // Возвращаем результат без сохранения на диск return result; } /** * **Новый метод:** Получает m3u8 плейлист в реальном времени. * Периодически дополняет плейлист новыми сегментами, сохраняет объединённый файл и возвращает объект с путём и содержимым. * @param spaceUrl URL твиттер-спейса (формат: https://x.com/i/spaces/<space_id>) * @param formatStr Шаблон имени файла (опционально) */ async getFullPlaylistRealtime(spaceUrl, formatStr) { const space = await twspace_1.Twspace.fromSpaceUrl(spaceUrl, this.api); const downloader = new twspace_dl_1.default(space, formatStr); return await downloader.getFullPlaylistRealtime(); } /** * Получает детальную информацию о Twitter Space. * @param spaceId ID твиттер-спейса (или полный URL) * @returns Объект с информацией о space (статус, название, создатель и др.) */ async getSpaceDetails(spaceId) { let spaceUrl = spaceId; // Если передан только ID, а не URL, формируем полный URL if (!spaceId.includes('x.com') && !spaceId.includes('twitter.com')) { spaceUrl = `https://x.com/i/spaces/${spaceId}`; } // Получаем полную информацию о Space const space = await twspace_1.Twspace.fromSpaceUrl(spaceUrl, this.api); // Возвращаем только нужные поля return { id: space.id, url: space.url, title: space.title, state: space.state, creator_name: space.creator_name, creator_screen_name: space.creator_screen_name, creator_profile_image_url: space.creator_profile_image_url, start_date: space.start_date, available_for_replay: space.available_for_replay }; } } exports.XDL = XDL; exports.default = XDL;