/* tslint:disable */
/* eslint-disable */
/**
 * Jellyfin API
 * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
 *
 * The version of the OpenAPI document: 10.8.9
 * 
 *
 * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
 * https://openapi-generator.tech
 * Do not edit the class manually.
 */


import * as runtime from '../runtime';
import type {
  GetPostedPlaybackInfoRequest,
  LiveStreamResponse,
  OpenLiveStreamRequest,
  PlaybackInfoResponse,
} from '../models';
import {
    GetPostedPlaybackInfoRequestFromJSON,
    GetPostedPlaybackInfoRequestToJSON,
    LiveStreamResponseFromJSON,
    LiveStreamResponseToJSON,
    OpenLiveStreamRequestFromJSON,
    OpenLiveStreamRequestToJSON,
    PlaybackInfoResponseFromJSON,
    PlaybackInfoResponseToJSON,
} from '../models';

export interface CloseLiveStreamRequest {
    liveStreamId: string;
}

export interface GetBitrateTestBytesRequest {
    size?: number;
}

export interface GetPlaybackInfoRequest {
    itemId: string;
    userId: string;
}

export interface GetPostedPlaybackInfoOperationRequest {
    itemId: string;
    userId?: string;
    maxStreamingBitrate?: number;
    startTimeTicks?: number;
    audioStreamIndex?: number;
    subtitleStreamIndex?: number;
    maxAudioChannels?: number;
    mediaSourceId?: string;
    liveStreamId?: string;
    autoOpenLiveStream?: boolean;
    enableDirectPlay?: boolean;
    enableDirectStream?: boolean;
    enableTranscoding?: boolean;
    allowVideoStreamCopy?: boolean;
    allowAudioStreamCopy?: boolean;
    getPostedPlaybackInfoRequest?: GetPostedPlaybackInfoRequest;
}

export interface OpenLiveStreamOperationRequest {
    openToken?: string;
    userId?: string;
    playSessionId?: string;
    maxStreamingBitrate?: number;
    startTimeTicks?: number;
    audioStreamIndex?: number;
    subtitleStreamIndex?: number;
    maxAudioChannels?: number;
    itemId?: string;
    enableDirectPlay?: boolean;
    enableDirectStream?: boolean;
    openLiveStreamRequest?: OpenLiveStreamRequest;
}

/**
 * 
 */
export class MediaInfoApi extends runtime.BaseAPI {

    /**
     * Closes a media source.
     */
    async closeLiveStreamRaw(requestParameters: CloseLiveStreamRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<void>> {
        if (requestParameters.liveStreamId === null || requestParameters.liveStreamId === undefined) {
            throw new runtime.RequiredError('liveStreamId','Required parameter requestParameters.liveStreamId was null or undefined when calling closeLiveStream.');
        }

        const queryParameters: any = {};

        if (requestParameters.liveStreamId !== undefined) {
            queryParameters['liveStreamId'] = requestParameters.liveStreamId;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // CustomAuthentication authentication
        }

        const response = await this.request({
            path: `/LiveStreams/Close`,
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.VoidApiResponse(response);
    }

    /**
     * Closes a media source.
     */
    async closeLiveStream(requestParameters: CloseLiveStreamRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<void> {
        await this.closeLiveStreamRaw(requestParameters, initOverrides);
    }

    /**
     * Tests the network with a request with the size of the bitrate.
     */
    async getBitrateTestBytesRaw(requestParameters: GetBitrateTestBytesRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Blob>> {
        const queryParameters: any = {};

        if (requestParameters.size !== undefined) {
            queryParameters['size'] = requestParameters.size;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // CustomAuthentication authentication
        }

        const response = await this.request({
            path: `/Playback/BitrateTest`,
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.BlobApiResponse(response);
    }

    /**
     * Tests the network with a request with the size of the bitrate.
     */
    async getBitrateTestBytes(requestParameters: GetBitrateTestBytesRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Blob> {
        const response = await this.getBitrateTestBytesRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Gets live playback media info for an item.
     */
    async getPlaybackInfoRaw(requestParameters: GetPlaybackInfoRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PlaybackInfoResponse>> {
        if (requestParameters.itemId === null || requestParameters.itemId === undefined) {
            throw new runtime.RequiredError('itemId','Required parameter requestParameters.itemId was null or undefined when calling getPlaybackInfo.');
        }

        if (requestParameters.userId === null || requestParameters.userId === undefined) {
            throw new runtime.RequiredError('userId','Required parameter requestParameters.userId was null or undefined when calling getPlaybackInfo.');
        }

        const queryParameters: any = {};

        if (requestParameters.userId !== undefined) {
            queryParameters['userId'] = requestParameters.userId;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // CustomAuthentication authentication
        }

        const response = await this.request({
            path: `/Items/{itemId}/PlaybackInfo`.replace(`{${"itemId"}}`, encodeURIComponent(String(requestParameters.itemId))),
            method: 'GET',
            headers: headerParameters,
            query: queryParameters,
        }, initOverrides);

        return new runtime.JSONApiResponse(response, (jsonValue) => PlaybackInfoResponseFromJSON(jsonValue));
    }

    /**
     * Gets live playback media info for an item.
     */
    async getPlaybackInfo(requestParameters: GetPlaybackInfoRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PlaybackInfoResponse> {
        const response = await this.getPlaybackInfoRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * For backwards compatibility parameters can be sent via Query or Body, with Query having higher precedence.  Query parameters are obsolete.
     * Gets live playback media info for an item.
     */
    async getPostedPlaybackInfoRaw(requestParameters: GetPostedPlaybackInfoOperationRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PlaybackInfoResponse>> {
        if (requestParameters.itemId === null || requestParameters.itemId === undefined) {
            throw new runtime.RequiredError('itemId','Required parameter requestParameters.itemId was null or undefined when calling getPostedPlaybackInfo.');
        }

        const queryParameters: any = {};

        if (requestParameters.userId !== undefined) {
            queryParameters['userId'] = requestParameters.userId;
        }

        if (requestParameters.maxStreamingBitrate !== undefined) {
            queryParameters['maxStreamingBitrate'] = requestParameters.maxStreamingBitrate;
        }

        if (requestParameters.startTimeTicks !== undefined) {
            queryParameters['startTimeTicks'] = requestParameters.startTimeTicks;
        }

        if (requestParameters.audioStreamIndex !== undefined) {
            queryParameters['audioStreamIndex'] = requestParameters.audioStreamIndex;
        }

        if (requestParameters.subtitleStreamIndex !== undefined) {
            queryParameters['subtitleStreamIndex'] = requestParameters.subtitleStreamIndex;
        }

        if (requestParameters.maxAudioChannels !== undefined) {
            queryParameters['maxAudioChannels'] = requestParameters.maxAudioChannels;
        }

        if (requestParameters.mediaSourceId !== undefined) {
            queryParameters['mediaSourceId'] = requestParameters.mediaSourceId;
        }

        if (requestParameters.liveStreamId !== undefined) {
            queryParameters['liveStreamId'] = requestParameters.liveStreamId;
        }

        if (requestParameters.autoOpenLiveStream !== undefined) {
            queryParameters['autoOpenLiveStream'] = requestParameters.autoOpenLiveStream;
        }

        if (requestParameters.enableDirectPlay !== undefined) {
            queryParameters['enableDirectPlay'] = requestParameters.enableDirectPlay;
        }

        if (requestParameters.enableDirectStream !== undefined) {
            queryParameters['enableDirectStream'] = requestParameters.enableDirectStream;
        }

        if (requestParameters.enableTranscoding !== undefined) {
            queryParameters['enableTranscoding'] = requestParameters.enableTranscoding;
        }

        if (requestParameters.allowVideoStreamCopy !== undefined) {
            queryParameters['allowVideoStreamCopy'] = requestParameters.allowVideoStreamCopy;
        }

        if (requestParameters.allowAudioStreamCopy !== undefined) {
            queryParameters['allowAudioStreamCopy'] = requestParameters.allowAudioStreamCopy;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        headerParameters['Content-Type'] = 'application/json';

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // CustomAuthentication authentication
        }

        const response = await this.request({
            path: `/Items/{itemId}/PlaybackInfo`.replace(`{${"itemId"}}`, encodeURIComponent(String(requestParameters.itemId))),
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: GetPostedPlaybackInfoRequestToJSON(requestParameters.getPostedPlaybackInfoRequest),
        }, initOverrides);

        return new runtime.JSONApiResponse(response, (jsonValue) => PlaybackInfoResponseFromJSON(jsonValue));
    }

    /**
     * For backwards compatibility parameters can be sent via Query or Body, with Query having higher precedence.  Query parameters are obsolete.
     * Gets live playback media info for an item.
     */
    async getPostedPlaybackInfo(requestParameters: GetPostedPlaybackInfoOperationRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PlaybackInfoResponse> {
        const response = await this.getPostedPlaybackInfoRaw(requestParameters, initOverrides);
        return await response.value();
    }

    /**
     * Opens a media source.
     */
    async openLiveStreamRaw(requestParameters: OpenLiveStreamOperationRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<LiveStreamResponse>> {
        const queryParameters: any = {};

        if (requestParameters.openToken !== undefined) {
            queryParameters['openToken'] = requestParameters.openToken;
        }

        if (requestParameters.userId !== undefined) {
            queryParameters['userId'] = requestParameters.userId;
        }

        if (requestParameters.playSessionId !== undefined) {
            queryParameters['playSessionId'] = requestParameters.playSessionId;
        }

        if (requestParameters.maxStreamingBitrate !== undefined) {
            queryParameters['maxStreamingBitrate'] = requestParameters.maxStreamingBitrate;
        }

        if (requestParameters.startTimeTicks !== undefined) {
            queryParameters['startTimeTicks'] = requestParameters.startTimeTicks;
        }

        if (requestParameters.audioStreamIndex !== undefined) {
            queryParameters['audioStreamIndex'] = requestParameters.audioStreamIndex;
        }

        if (requestParameters.subtitleStreamIndex !== undefined) {
            queryParameters['subtitleStreamIndex'] = requestParameters.subtitleStreamIndex;
        }

        if (requestParameters.maxAudioChannels !== undefined) {
            queryParameters['maxAudioChannels'] = requestParameters.maxAudioChannels;
        }

        if (requestParameters.itemId !== undefined) {
            queryParameters['itemId'] = requestParameters.itemId;
        }

        if (requestParameters.enableDirectPlay !== undefined) {
            queryParameters['enableDirectPlay'] = requestParameters.enableDirectPlay;
        }

        if (requestParameters.enableDirectStream !== undefined) {
            queryParameters['enableDirectStream'] = requestParameters.enableDirectStream;
        }

        const headerParameters: runtime.HTTPHeaders = {};

        headerParameters['Content-Type'] = 'application/json';

        if (this.configuration && this.configuration.apiKey) {
            headerParameters["Authorization"] = this.configuration.apiKey("Authorization"); // CustomAuthentication authentication
        }

        const response = await this.request({
            path: `/LiveStreams/Open`,
            method: 'POST',
            headers: headerParameters,
            query: queryParameters,
            body: OpenLiveStreamRequestToJSON(requestParameters.openLiveStreamRequest),
        }, initOverrides);

        return new runtime.JSONApiResponse(response, (jsonValue) => LiveStreamResponseFromJSON(jsonValue));
    }

    /**
     * Opens a media source.
     */
    async openLiveStream(requestParameters: OpenLiveStreamOperationRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<LiveStreamResponse> {
        const response = await this.openLiveStreamRaw(requestParameters, initOverrides);
        return await response.value();
    }

}
