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
JavaScript
;
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;