UNPKG

@twurple/api

Version:

Interact with Twitch's API.

310 lines (309 loc) 11.4 kB
var HelixStreamApi_1; import { __decorate } from "tslib"; import { Enumerable, flatten, mapNullable } from '@d-fischer/shared-utils'; import { createBroadcasterQuery, HttpStatusCodeError, } from '@twurple/api-call'; import { extractUserId, extractUserName, rtfm } from '@twurple/common'; import { StreamNotLiveError } from "../../errors/StreamNotLiveError.mjs"; import { createSingleKeyQuery, createUserQuery } from "../../interfaces/endpoints/generic.external.mjs"; import { createStreamMarkerBody, createStreamQuery, createVideoQuery, } from "../../interfaces/endpoints/stream.external.mjs"; import { HelixRequestBatcher } from "../../utils/HelixRequestBatcher.mjs"; import { HelixPaginatedRequest } from "../../utils/pagination/HelixPaginatedRequest.mjs"; import { createPaginatedResult } from "../../utils/pagination/HelixPaginatedResult.mjs"; import { createPaginationQuery, } from "../../utils/pagination/HelixPagination.mjs"; import { BaseApi } from "../BaseApi.mjs"; import { HelixStream } from "./HelixStream.mjs"; import { HelixStreamMarker } from "./HelixStreamMarker.mjs"; import { HelixStreamMarkerWithVideo } from "./HelixStreamMarkerWithVideo.mjs"; /** * The Helix API methods that deal with streams. * * Can be accessed using `client.streams` on an {@link ApiClient} instance. * * ## Example * ```ts * const api = new ApiClient({ authProvider }); * const stream = await api.streams.getStreamByUserId('125328655'); * ``` * * @meta category helix * @meta categorizedTitle Streams */ let HelixStreamApi = HelixStreamApi_1 = class HelixStreamApi extends BaseApi { constructor() { super(...arguments); /** @internal */ this._getStreamByUserIdBatcher = new HelixRequestBatcher({ url: 'streams', }, 'user_id', 'user_id', this._client, (data) => new HelixStream(data, this._client)); /** @internal */ this._getStreamByUserNameBatcher = new HelixRequestBatcher({ url: 'streams', }, 'user_login', 'user_login', this._client, (data) => new HelixStream(data, this._client)); } /** * Gets a list of streams. * * @param filter * @expandParams */ async getStreams(filter = {}) { const result = await this._client.callApi({ url: 'streams', type: 'helix', query: { ...createStreamQuery(filter), ...createPaginationQuery(filter), }, }); return createPaginatedResult(result, HelixStream, this._client); } /** * Creates a paginator for streams. * * @param filter * @expandParams */ getStreamsPaginated(filter = {}) { return new HelixPaginatedRequest({ url: 'streams', query: createStreamQuery(filter), }, this._client, data => new HelixStream(data, this._client)); } /** * Gets the current streams for the given usernames. * * @param users The username to get the streams for. */ async getStreamsByUserNames(users) { const result = await this.getStreams({ userName: users.map(extractUserName) }); return result.data; } /** * Gets the current stream for the given username. * * @param user The username to get the stream for. */ async getStreamByUserName(user) { var _a; const result = await this.getStreamsByUserNames([user]); return (_a = result[0]) !== null && _a !== void 0 ? _a : null; } /** * Gets the current stream for the given username, batching multiple calls into fewer requests as the API allows. * * @param user The username to get the stream for. */ async getStreamByUserNameBatched(user) { return await this._getStreamByUserNameBatcher.request(extractUserName(user)); } /** * Gets the current streams for the given user IDs. * * @param users The user IDs to get the streams for. */ async getStreamsByUserIds(users) { const result = await this.getStreams({ userId: users.map(extractUserId) }); return result.data; } /** * Gets the current stream for the given user ID. * * @param user The user ID to get the stream for. */ async getStreamByUserId(user) { const userId = extractUserId(user); const result = await this._client.callApi({ url: 'streams', type: 'helix', userId, query: createStreamQuery({ userId }), }); return mapNullable(result.data[0], data => new HelixStream(data, this._client)); } /** * Gets the current stream for the given user ID, batching multiple calls into fewer requests as the API allows. * * @param user The user ID to get the stream for. */ async getStreamByUserIdBatched(user) { return await this._getStreamByUserIdBatcher.request(extractUserId(user)); } /** * Gets a list of all stream markers for a user. * * @param user The user to list the stream markers for. * @param pagination * * @expandParams */ async getStreamMarkersForUser(user, pagination) { var _a; const result = await this._client.callApi({ url: 'streams/markers', type: 'helix', query: { ...createUserQuery(user), ...createPaginationQuery(pagination), }, userId: extractUserId(user), scopes: ['user:read:broadcast'], canOverrideScopedUserContext: true, }); return { data: flatten(result.data.map(data => HelixStreamApi_1._mapGetStreamMarkersResult(data, this._client))), cursor: (_a = result.pagination) === null || _a === void 0 ? void 0 : _a.cursor, }; } /** * Creates a paginator for all stream markers for a user. * * @param user The user to list the stream markers for. */ getStreamMarkersForUserPaginated(user) { return new HelixPaginatedRequest({ url: 'streams/markers', query: createUserQuery(user), userId: extractUserId(user), scopes: ['user:read:broadcast'], canOverrideScopedUserContext: true, }, this._client, data => HelixStreamApi_1._mapGetStreamMarkersResult(data, this._client)); } /** * Gets a list of all stream markers for a video. * * @param user The user the video belongs to. * @param videoId The video to list the stream markers for. * @param pagination * * @expandParams */ async getStreamMarkersForVideo(user, videoId, pagination) { var _a; const result = await this._client.callApi({ url: 'streams/markers', type: 'helix', query: { ...createVideoQuery(videoId), ...createPaginationQuery(pagination), }, userId: extractUserId(user), scopes: ['user:read:broadcast'], canOverrideScopedUserContext: true, }); return { data: flatten(result.data.map(data => HelixStreamApi_1._mapGetStreamMarkersResult(data, this._client))), cursor: (_a = result.pagination) === null || _a === void 0 ? void 0 : _a.cursor, }; } /** * Creates a paginator for all stream markers for a video. * * @param user The user the video belongs to. * @param videoId The video to list the stream markers for. */ getStreamMarkersForVideoPaginated(user, videoId) { return new HelixPaginatedRequest({ url: 'streams/markers', query: createVideoQuery(videoId), userId: extractUserId(user), scopes: ['user:read:broadcast'], canOverrideScopedUserContext: true, }, this._client, data => HelixStreamApi_1._mapGetStreamMarkersResult(data, this._client)); } /** * Creates a new stream marker. * * Only works while the specified user's stream is live. * * @param broadcaster The broadcaster to create a stream marker for. * @param description The description of the marker. */ async createStreamMarker(broadcaster, description) { try { const result = await this._client.callApi({ url: 'streams/markers', method: 'POST', type: 'helix', userId: extractUserId(broadcaster), scopes: ['channel:manage:broadcast'], canOverrideScopedUserContext: true, jsonBody: createStreamMarkerBody(broadcaster, description), }); return new HelixStreamMarker(result.data[0], this._client); } catch (e) { if (e instanceof HttpStatusCodeError && e.statusCode === 404) { throw new StreamNotLiveError({ cause: e }); } throw e; } } /** * Gets the stream key of a stream. * * @param broadcaster The broadcaster to get the stream key for. */ async getStreamKey(broadcaster) { const userId = extractUserId(broadcaster); const result = await this._client.callApi({ type: 'helix', url: 'streams/key', userId, scopes: ['channel:read:stream_key'], query: createBroadcasterQuery(broadcaster), }); return result.data[0].stream_key; } /** * Gets the streams that are currently live and are followed by the given user. * * @param user The user to check followed streams for. * @param pagination * * @expandParams */ async getFollowedStreams(user, pagination) { const userId = extractUserId(user); const result = await this._client.callApi({ type: 'helix', url: 'streams/followed', userId, scopes: ['user:read:follows'], query: { ...createSingleKeyQuery('user_id', userId), ...createPaginationQuery(pagination), }, }); return createPaginatedResult(result, HelixStream, this._client); } /** * Creates a paginator for the streams that are currently live and are followed by the given user. * * @param user The user to check followed streams for. */ getFollowedStreamsPaginated(user) { const userId = extractUserId(user); return new HelixPaginatedRequest({ url: 'streams/followed', userId, scopes: ['user:read:follows'], query: createSingleKeyQuery('user_id', userId), }, this._client, data => new HelixStream(data, this._client)); } static _mapGetStreamMarkersResult(data, client) { return data.videos.reduce((result, video) => [ ...result, ...video.markers.map(marker => new HelixStreamMarkerWithVideo(marker, video.video_id, client)), ], []); } }; __decorate([ Enumerable(false) ], HelixStreamApi.prototype, "_getStreamByUserIdBatcher", void 0); __decorate([ Enumerable(false) ], HelixStreamApi.prototype, "_getStreamByUserNameBatcher", void 0); HelixStreamApi = HelixStreamApi_1 = __decorate([ rtfm('api', 'HelixStreamApi') ], HelixStreamApi); export { HelixStreamApi };