-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathmap.json
1 lines (1 loc) · 227 KB
/
map.json
1
{"/NTgCalls/Advanced Methods/Get State.xml": "<page>\n <h1>Get State</h1>\n <config id=\"GET_STATE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"7-10\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n ...\n\n state = app.get_state(\n -1001185324811,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\"><sb>get_state</sb></ref>() <shi>-></shi> <docs-ref link=\"/NTgCalls/Available Types/MediaState\">ntgcalls.MediaState</docs-ref>\n </category-title>\n <subtext>\n <config id=\"GET_STATE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"NTG_NO_GROUP_CALL\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/ntg_calls.xml": "<page>\n <h1>ntg_calls</h1>\n <text>\n This function returns a list of <code>ntg_call_struct</code> instances,\n each containing information about an active group call associated with the channel or group.\n You should provide a buffer as an array of <code>ntg_call_struct</code>\n elements with a size matching the value returned by <code>ntg_calls_count</code>.\n The function populates this list with data for active group calls and returns the number of group calls retrieved.\n </text>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"11\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uint32_t uid = ntg_init();\n ...\n int size = ... ; // Get the size of the call list\n ntg_call_struct buffer[size];\n ntg_async_struct future;\n // Initialize the async struct\n int result = ntg_calls(uid, buffer, size, &future);\n // Wait for the async operation to complete\n for (int i = 0; i < result; i++) {\n printf(\"Group Call %d:\\n\", i + 1);\n printf(\" Chat ID: %lld\\n\", buffer[i].chatId);\n printf(\" Status: %d\\n\", buffer[i].status);\n }\n ... // Your Code Here\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_calls</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"LIST_CALLS_DESC\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_call_struct\">ntg_call_struct</docs-ref><shi language=\"c\">*</shi> <ref><sb>buffer</sb></ref></category-title>\n <subtext><text>The buffer that will hold the retrieved group call information.</text></subtext>\n\n <config id=\"ARG_BUF_SIZE\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_C_EXCEPTIONS\"/>\n <config id=\"SMALL_BUFF_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/ntg_calls_count.xml": "<page>\n <h1>ntg_calls_count</h1>\n <text>\n This function returns the number of active group calls that NTgCalls is connected to.\n </text>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"11\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uint32_t uid = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n int count = 0;\n ntg_async_struct future;\n // Initialize the async struct\n int result = ntg_calls_count(uid, &count, &future);\n // Wait for the async operation to complete\n printf(\"Number of active group calls: %d\\n\", count);\n ... // Your Code Here\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_calls_count</sb></ref>()\n </category-title>\n <subtext>\n <text>Returns the number of active group calls.</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n <category-title><shi language=\"c\">int*</shi> <ref><sb>count</sb></ref></category-title>\n <subtext>The number of active group calls.</subtext>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_C_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/ntg_cpu_usage.xml": "<page>\n <h1>ntg_cpu_usage</h1>\n <config id=\"CPU_USAGE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uint32_t uid = ntg_init();\n ...\n double buffer;\n ntg_async_struct future;\n // Initialize the async struct\n int64_t usage = ntg_cpu_usage(uid, &buffer, &future);\n // Wait for the async operation to complete and use\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_cpu_usage</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"CPU_USAGE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n <category-title><shi language=\"c\">double</shi><shi language=\"c\">*</shi> <ref><sb>cpuUsage</sb></ref></category-title>\n <subtext><config id=\"CPU_USAGE_DESC3\"/></subtext>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/ntg_get_protocol.xml": "<page>\n <h1>ntg_get_protocol</h1>\n <config id=\"GET_PROTOCOL_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"11\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uint32_t uid = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n ntg_protocol_struct buffer;\n int result = ntg_get_protocol(uid, chatID, &buffer);\n ...\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_get_protocol</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"GET_PROTOCOL_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_protocol_struct\">ntg_protocol_struct</docs-ref><shi language=\"c\">*</shi> <ref><sb>protocol</sb></ref></category-title>\n <subtext><config id=\"PROTOCOL_DESC\"/></subtext>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/ntg_get_state.xml": "<page>\n <h1>ntg_get_state</h1>\n <config id=\"GET_STATE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"11\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uint32_t uid = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n ntg_media_state_struct buffer;\n ntg_async_struct future;\n // Initialize the async struct\n int result = ntg_get_state(uid, chatID, &buffer, &future);\n // Wait for the async operation to complete and use\n // the buffer for EditGroupCallParticipant\n ...\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_get_state</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"GET_STATE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_media_state_struct\">ntg_media_state_struct</docs-ref><shi language=\"c\">*</shi> <ref><sb>mediaState</sb></ref></category-title>\n <subtext><config id=\"MEDIA_STATE_DESC\"/></subtext>\n\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Advanced Methods/ntg_send_signaling_data.xml": "<page>\n <h1>ntg_send_signaling_data</h1>\n <config id=\"SEND_SIGNALING_DATA_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"12\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uint32_t uid = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n uint8_t* buffer = ...; // Obtain the signaling data\n int size = ...; // Obtain the size of the signaling data\n ntg_async_struct future;\n // Initialize the async struct\n int result = ntg_send_signaling_data(uid, chatID, buffer, size, &future);\n // Wait for the async operation to complete\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_send_signaling_data</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"SEND_SIGNALING_DATA_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n\n <category-title><shi language=\"c\">uint8_t</shi><shi language=\"c\">*</shi> <ref><sb>data</sb></ref></category-title>\n <subtext><config id=\"SIGNALING_DATA_DESC\"/></subtext>\n <category-title><shi language=\"c\">int</shi> <ref><sb>size</sb></ref></category-title>\n <subtext><text>Size of the data</text></subtext>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Available Enums/ConnectionState.xml": "<page>\n <h1>ConnectionState</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\"><sb>ConnectionState</sb></ref>\n </category-title>\n <subtext>\n <config id=\"CONNECTION_STATE_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>CONNECTING</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"NTG_STATE_CONNECTING_DESC\"/>\n <category-title><ref><sb>CONNECTED</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"NTG_STATE_CONNECTED_DESC\"/>\n <category-title><ref><sb>TIMEOUT</sb></ref> <shi>=</shi> 4</category-title>\n <config id=\"NTG_STATE_TIMEOUT_DESC\"/>\n <category-title><ref><sb>FAILED</sb></ref> <shi>=</shi> 8</category-title>\n <config id=\"NTG_STATE_FAILED_DESC\"/>\n <category-title><ref><sb>CLOSED</sb></ref> <shi>=</shi> 12</category-title>\n <config id=\"NTG_STATE_CLOSED_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/InputMode.xml": "<page>\n <h1>InputMode</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>InputMode</sb></ref>\n </category-title>\n <subtext>\n <config id=\"INPUT_MODE_DESC2\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>FILE</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"MODE_FILE_DESC\"/>\n\n <category-title><ref><sb>SHELL</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"MODE_SHELL_DESC\"/>\n\n <category-title><ref><sb>FFMPEG</sb></ref> <shi>=</shi> 4</category-title>\n <config id=\"MODE_FFMPEG_DESC\"/>\n\n <category-title><ref><sb>NO_LATENCY</sb></ref> <shi>=</shi> 8</category-title>\n <config id=\"MODE_NO_LATENCY_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/StreamStatus.xml": "<page>\n <h1>StreamStatus</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>StreamStatus</sb></ref>\n </category-title>\n <subtext>\n <config id=\"STREAM_STATUS_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>PLAYING</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"STATUS_PLAYING_DESC\"/>\n\n <category-title><ref><sb>PAUSED</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"STATUS_PAUSED_DESC\"/>\n\n <category-title><ref><sb>IDLING</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"STATUS_IDLING_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/StreamType.xml": "<page>\n <h1>StreamType</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>StreamType</sb></ref>\n </category-title>\n <subtext>\n <config id=\"STREAM_TYPE_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>AUDIO</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"TYPE_AUDIO_DESC\"/>\n\n <category-title><ref><sb>VIDEO</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"TYPE_VIDEO_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/ntg_connection_state_enum.xml": "<page>\n <h1>ntg_connection_state_enum</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef enum</shi> <ref src=\"enum\"><sb>ntg_connection_state_enum</sb></ref>\n </category-title>\n <subtext>\n <config id=\"CONNECTION_STATE_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>NTG_STATE_CONNECTING</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"NTG_STATE_CONNECTING_DESC\"/>\n\n <category-title><ref><sb>NTG_STATE_CONNECTED</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"NTG_STATE_CONNECTED_DESC\"/>\n\n <category-title><ref><sb>NTG_STATE_TIMEOUT</sb></ref> <shi>=</shi> 4</category-title>\n <config id=\"NTG_STATE_TIMEOUT_DESC\"/>\n\n <category-title><ref><sb>NTG_STATE_FAILED</sb></ref> <shi>=</shi> 8</category-title>\n <config id=\"NTG_STATE_FAILED_DESC\"/>\n\n <category-title><ref><sb>NTG_STATE_CLOSED</sb></ref> <shi>=</shi> 12</category-title>\n <config id=\"NTG_STATE_CLOSED_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/ntg_input_mode_enum.xml": "<page>\n <h1>ntg_input_mode_enum</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef enum</shi> <ref src=\"enum\"><sb>ntg_input_mode_enum</sb></ref>\n </category-title>\n <subtext>\n <config id=\"INPUT_MODE_DESC2\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>NTG_FILE</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"MODE_FILE_DESC\"/>\n\n <category-title><ref><sb>NTG_SHELL</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"MODE_SHELL_DESC\"/>\n\n <category-title><ref><sb>NTG_FFMPEG</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"MODE_FFMPEG_DESC\"/>\n\n <category-title><ref><sb>NTG_NO_LATENCY</sb></ref> <shi>=</shi> 3</category-title>\n <config id=\"MODE_NO_LATENCY_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/ntg_log_level_enum.xml": "<page>\n <h1>ntg_log_level_enum</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef enum</shi> <ref src=\"enum\"><sb>ntg_log_level_enum</sb></ref>\n </category-title>\n <subtext>\n <config id=\"LOG_LEVEL_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>NTG_LOG_DEBUG</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"NTG_LOG_DEBUG_DESC\"/>\n\n <category-title><ref><sb>NTG_LOG_INFO</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"LOG_LEVEL_INFO_DESC\"/>\n\n <category-title><ref><sb>NTG_LOG_WARNING</sb></ref> <shi>=</shi> 4</category-title>\n <config id=\"LOG_LEVEL_WARNING_DESC\"/>\n\n <category-title><ref><sb>NTG_LOG_ERROR</sb></ref> <shi>=</shi> 8</category-title>\n <config id=\"LOG_LEVEL_ERROR_DESC\"/>\n\n <category-title><ref><sb>NTG_LOG_UNKNOWN</sb></ref> <shi>=</shi> -1</category-title>\n <config id=\"LOG_LEVEL_UNKNOWN_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/ntg_log_source_enum.xml": "<page>\n <h1>ntg_log_source_enum</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef enum</shi> <ref src=\"enum\"><sb>ntg_log_source_enum</sb></ref>\n </category-title>\n <subtext>\n <config id=\"LOG_SOURCE_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>NTG_LOG_WEBRTC</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"NTG_LOG_WEBRTC_DESC\"/>\n\n <category-title><ref><sb>NTG_LOG_SELF</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"NTG_LOG_SELF_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/ntg_stream_status_enum.xml": "<page>\n <h1>ntg_stream_status_enum</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef enum</shi> <ref src=\"enum\"><sb>ntg_stream_status_enum</sb></ref>\n </category-title>\n <subtext>\n <config id=\"STREAM_STATUS_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>NTG_PLAYING</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"STATUS_PLAYING_DESC\"/>\n\n <category-title><ref><sb>NTG_PAUSED</sb></ref> <shi>=</shi> 2</category-title>\n <config id=\"STATUS_PAUSED_DESC\"/>\n\n <category-title><ref><sb>NTG_IDLING</sb></ref> <shi>=</shi> 4</category-title>\n <config id=\"STATUS_IDLING_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Enums/ntg_stream_type_enum.xml": "<page>\n <h1>ntg_stream_type_enum</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef enum</shi> <ref src=\"enum\"><sb>ntg_stream_type_enum</sb></ref>\n </category-title>\n <subtext>\n <config id=\"STREAM_TYPE_DESC\"/>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>NTG_STREAM_AUDIO</sb></ref> <shi>=</shi> 0</category-title>\n <config id=\"TYPE_AUDIO_DESC\"/>\n\n <category-title><ref><sb>NTG_STREAM_VIDEO</sb></ref> <shi>=</shi> 1</category-title>\n <config id=\"TYPE_VIDEO_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_audio_description_struct.xml": "<page>\n <h1>ntg_audio_description_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_audio_description_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"AUDIO_CONFIG_DESC\"/>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_INPUT_MODE\"/>\n <config id=\"ARG_C_INPUT_MEDIA\"/>\n\n <category-title><shi language=\"c\">uint32_t</shi> <ref>sampleRate</ref></category-title>\n <config id=\"AUDIO_SAMPLE_DESC\"/>\n\n <category-title><shi language=\"c\">uint8_t</shi> <ref>bitsPerSample</ref></category-title>\n <config id=\"AUDIO_BPS_DESC\"/>\n\n <category-title><shi language=\"c\">uint8_t</shi> <ref>channelCount</ref></category-title>\n <config id=\"AUDIO_CHAN_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_auth_params_struct.xml": "<page>\n <h1>ntg_auth_params_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_auth_params_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"AUTH_PARAMS_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><shi language=\"c\">uint8_t*</shi> <ref>g_a_or_b</ref></category-title>\n <config id=\"G_A_OR_B_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref>sizeGAB</ref></category-title>\n <subtext><text>Size of the parameter for key exchange</text></subtext>\n <category-title><shi language=\"c\">int64_t</shi> <ref>key_fingerprint</ref></category-title>\n <config id=\"KEY_FINGERPRINT_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_call_struct.xml": "<page>\n <h1>ntg_call_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_call_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"CALL_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><shi language=\"c\">int64_t</shi> <ref>chatID</ref></category-title>\n <config id=\"CHAT_ID_DESC\"/>\n\n <category-title><docs-ref link=\"/NTgCalls/Available Enums/ntg_stream_status_enum\">ntg_stream_status_enum</docs-ref> <ref>status</ref></category-title>\n <config id=\"STREAM_STATUS_DESC2\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_dh_config_struct.xml": "<page>\n <h1>ntg_dh_config_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_dh_config_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"DH_CONFIG_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><shi language=\"c\">int32_t</shi> <ref>g</ref></category-title>\n <config id=\"G_DESC\"/>\n <category-title><shi language=\"c\">uint8_t*</shi> <ref>p</ref></category-title>\n <config id=\"P_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref>sizeP</ref></category-title>\n <subtext><text>Size of the parameter for key exchange</text></subtext>\n <category-title><shi language=\"c\">uint8_t*</shi> <ref>random</ref></category-title>\n <config id=\"R_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref>sizeRandom</ref></category-title>\n <subtext><text>Size of the random number</text></subtext>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_log_message_struct.xml": "<page>\n <h1>ntg_log_message_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_log_message_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"LOG_MESSAGE_STRUCT_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><docs-ref link=\"/NTgCalls/Available Enums/ntg_log_level_enum\">ntg_log_level_enum</docs-ref> <ref><sb>level</sb></ref></category-title>\n <subtext><config id=\"LOG_LEVEL_DESC\"/></subtext>\n <category-title><docs-ref link=\"/NTgCalls/Available Enums/ntg_log_source_enum\">ntg_log_source_enum</docs-ref> <ref><sb>source</sb></ref></category-title>\n <subtext><config id=\"LOG_SOURCE_DESC\"/></subtext>\n <category-title><shi language=\"c\">char*</shi> <ref><sb>file</sb></ref></category-title>\n <subtext><config id=\"LOG_FILE_DESC\"/></subtext>\n <category-title><shi language=\"c\">uint32_t</shi> <ref><sb>line</sb></ref></category-title>\n <subtext><config id=\"LOG_LINE_DESC\"/></subtext>\n <category-title><shi language=\"c\">char*</shi> <ref><sb>message</sb></ref></category-title>\n <subtext><config id=\"LOG_MESSAGE_DESC\"/></subtext>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_media_description_struct.xml": "<page>\n <h1>ntg_media_description_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_media_description_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"MEDIA_DESC\"/>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_audio_description_struct\">ntg_audio_description_struct</docs-ref><shi language=\"c\">*</shi> <ref>audio</ref></category-title>\n <config id=\"AUDIO_DESC\"/>\n\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_video_description_struct\">ntg_video_description_struct</docs-ref><shi language=\"c\">*</shi> <ref>video</ref></category-title>\n <config id=\"VIDEO_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_media_state_struct.xml": "<page>\n <h1>ntg_media_state_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_media_state_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"MEDIA_STATE_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><shi language=\"c++\">bool</shi> <ref>muted</ref></category-title>\n <config id=\"MEDIA_MUTED_DESC\"/>\n\n <category-title><shi language=\"c++\">bool</shi> <ref>videoPaused</ref></category-title>\n <config id=\"MEDIA_PAUSED_DESC\"/>\n\n <category-title><shi language=\"c++\">bool</shi> <ref>videoStopped</ref></category-title>\n <config id=\"MEDIA_STOPPED_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_protocol_struct.xml": "<page>\n <h1>ntg_protocol_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_protocol_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"PROTOCOL_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <category-title><shi language=\"c\">int32_t</shi> <ref>minLayer</ref></category-title>\n <config id=\"MIN_LAYER_DESC\"/>\n <category-title><shi language=\"c\">int32_t</shi> <ref>maxLayer</ref></category-title>\n <config id=\"MAX_LAYER_DESC\"/>\n <category-title><shi language=\"c++\">bool</shi> <ref>udpP2P</ref></category-title>\n <config id=\"UDP_P2P_DESC\"/>\n <category-title><shi language=\"c++\">bool</shi> <ref>udpReflector</ref></category-title>\n <config id=\"UDP_REFLECTOR_DESC\"/>\n <category-title><shi language=\"c\">char**</shi> <ref>libraryVersions</ref></category-title>\n <config id=\"LIBRARY_VERSIONS_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref>libraryVersionsSize</ref></category-title>\n <subtext><text>Size of the libraryVersions array.</text></subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_rtc_server_struct.xml": "<page>\n <h1>ntg_rtc_server_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_rtc_server_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"RTC_SERVER_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><shi language=\"c\">uint64_t</shi> <ref>id</ref></category-title>\n <config id=\"RTC_ID_DESC\"/>\n <category-title><shi language=\"c\">char*</shi> <ref>ipv4</ref></category-title>\n <config id=\"RTC_IPV4_DESC\"/>\n <category-title><shi language=\"c\">char*</shi> <ref>ipv6</ref></category-title>\n <config id=\"RTC_IPV6_DESC\"/>\n <category-title><shi language=\"c\">char*</shi> <ref>username</ref></category-title>\n <config id=\"RTC_USERNAME_DESC\"/>\n <category-title><shi language=\"c\">char*</shi> <ref>password</ref></category-title>\n <config id=\"RTC_PASSWORD_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref>port</ref></category-title>\n <config id=\"RTC_PORT_DESC\"/>\n <category-title><shi language=\"c++\">bool</shi> <ref>turn</ref></category-title>\n <config id=\"RTC_TURN_DESC\"/>\n <category-title><shi language=\"c++\">bool</shi> <ref>stun</ref></category-title>\n <config id=\"RTC_STUN_DESC\"/>\n <category-title><shi language=\"c++\">bool</shi> <ref>tcp</ref></category-title>\n <config id=\"RTC_TCP_DESC\"/>\n <category-title><shi language=\"c\">uint8_t*</shi> <ref>peerTag</ref></category-title>\n <config id=\"RTC_PEER_TAG_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref>sizePeerTag</ref></category-title>\n <subtext><text>Size of the peer tag</text></subtext>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Structs/ntg_video_description_struct.xml": "<page>\n <h1>ntg_video_description_struct</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef struct</shi> <ref src=\"type\"><sb>ntg_video_description_struct</sb></ref>\n </category-title>\n <subtext>\n <config id=\"VIDEO_CONFIG_DESC\"/>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_INPUT_MODE\"/>\n <config id=\"ARG_C_INPUT_MEDIA\"/>\n\n <category-title><shi language=\"c\">uint16_t</shi> <ref>width</ref></category-title>\n <config id=\"VIDEO_WIDTH_DESC\"/>\n\n <category-title><shi language=\"c\">uint16_t</shi> <ref>height</ref></category-title>\n <config id=\"VIDEO_HEIGHT_DESC\"/>\n\n <category-title><shi language=\"c\">uint8_t</shi> <ref>fps</ref></category-title>\n <config id=\"VIDEO_FPS_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/AudioDescription.xml": "<page>\n <h1>AudioDescription</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.types.<sb>AudioDescription</sb></ref>\n </category-title>\n <subtext>\n <config id=\"AUDIO_CONFIG_DESC\"/>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INPUT_MODE\"/>\n\n <config id=\"ARG_C_INPUT_MEDIA\"/>\n\n <category-title><ref>sample_rate</ref>: <shi>int</shi></category-title>\n <config id=\"AUDIO_SAMPLE_DESC\"/>\n\n <category-title><ref>bits_per_sample</ref>: <shi>int</shi></category-title>\n <config id=\"AUDIO_BPS_DESC\"/>\n\n <category-title><ref>channel_count</ref>: <shi>int</shi></category-title>\n <config id=\"AUDIO_CHAN_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/AuthParams.xml": "<page>\n <h1>AuthParams</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>AuthParams</sb></ref>\n </category-title>\n <subtext>\n <config id=\"AUTH_PARAMS_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><ref>g_a_or_b</ref>: <shi>bytes</shi></category-title>\n <config id=\"G_A_OR_B_DESC\"/>\n <category-title><ref>key_fingerprint</ref>: <shi>int</shi></category-title>\n <config id=\"KEY_FINGERPRINT_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/DhConfig.xml": "<page>\n <h1>DhConfig</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>DhConfig</sb></ref>\n </category-title>\n <subtext>\n <config id=\"DH_CONFIG_DESC\"/>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>g</ref>: <shi>int</shi></category-title>\n <config id=\"G_DESC\"/>\n <category-title><ref>p</ref>: <shi>bytes</shi></category-title>\n <config id=\"P_DESC\"/>\n <category-title><ref>random</ref>: <shi>bytes</shi></category-title>\n <config id=\"R_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/MediaDescription.xml": "<page>\n <h1>MediaDescription</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.types.<sb>MediaDescription</sb></ref>\n </category-title>\n <subtext>\n <config id=\"MEDIA_DESC\"/>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>audio</ref>: <shi>Optional[</shi><docs-ref link=\"/NTgCalls/Available Types/AudioDescription\">ntgcalls.AudioDescription</docs-ref><shi>]</shi></category-title>\n <config id=\"AUDIO_DESC\"/>\n\n <category-title><ref>video</ref>: <shi>Optional[</shi><docs-ref link=\"/NTgCalls/Available Types/VideoDescription\">ntgcalls.VideoDescription</docs-ref><shi>]</shi></category-title>\n <config id=\"VIDEO_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/MediaState.xml": "<page>\n <h1>MediaState</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>MediaState</sb></ref>\n </category-title>\n <subtext>\n <config id=\"MEDIA_STATE_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><ref><sb>muted</sb></ref> <shi>-> bool</shi></category-title>\n <config id=\"MEDIA_MUTED_DESC\"/>\n\n <category-title><ref><sb>video_paused</sb></ref> <shi>-> bool</shi></category-title>\n <config id=\"MEDIA_PAUSED_DESC\"/>\n\n <category-title><ref><sb>video_stopped</sb></ref> <shi>-> bool</shi></category-title>\n <config id=\"MEDIA_STOPPED_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/Protocol.xml": "<page>\n <h1>Protocol</h1>\n <br/>\n <category-title noref=\"true\">\n <shi language=\"c\">typedef enum</shi> <ref src=\"enum\"><sb>Protocol</sb></ref>\n </category-title>\n <subtext>\n <config id=\"PROTOCOL_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><ref>min_layer</ref>: <shi>int</shi></category-title>\n <config id=\"MIN_LAYER_DESC\"/>\n <category-title><ref>max_layer</ref>: <shi>int</shi></category-title>\n <config id=\"MAX_LAYER_DESC\"/>\n <category-title><ref>udp_p2p</ref>: <shi>bool</shi></category-title>\n <config id=\"UDP_P2P_DESC\"/>\n <category-title><ref>udp_reflector</ref>: <shi>bool</shi></category-title>\n <config id=\"UDP_REFLECTOR_DESC\"/>\n <category-title><ref>library_versions</ref>: <shi>list</shi>[<shi>str</shi>]</category-title>\n <config id=\"LIBRARY_VERSIONS_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/RTCServer.xml": "<page>\n <h1>RTCServer</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>RTCServer</sb></ref>\n </category-title>\n <subtext>\n <config id=\"RTC_SERVER_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><ref>id</ref>: <shi>int</shi></category-title>\n <config id=\"RTC_ID_DESC\"/>\n <category-title><ref>ipv4</ref>: <shi>str</shi></category-title>\n <config id=\"RTC_IPV4_DESC\"/>\n <category-title><ref>ipv6</ref>: <shi>str</shi></category-title>\n <config id=\"RTC_IPV6_DESC\"/>\n <category-title><ref>username</ref>: Optional[<shi>str</shi>]</category-title>\n <config id=\"RTC_USERNAME_DESC\"/>\n <category-title><ref>password</ref>: Optional[<shi>str</shi>]</category-title>\n <config id=\"RTC_PASSWORD_DESC\"/>\n <category-title><ref>port</ref>: <shi>int</shi></category-title>\n <config id=\"RTC_PORT_DESC\"/>\n <category-title><ref>turn</ref>: <shi>bool</shi></category-title>\n <config id=\"RTC_TURN_DESC\"/>\n <category-title><ref>stun</ref>: <shi>bool</shi></category-title>\n <config id=\"RTC_STUN_DESC\"/>\n <category-title><ref>tcp</ref>: <shi>bool</shi></category-title>\n <config id=\"RTC_TCP_DESC\"/>\n <category-title><ref>peer_tag</ref>: Optional[<shi>bytes</shi>]</category-title>\n <config id=\"RTC_PEER_TAG_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Available Types/VideoDescription.xml": "<page>\n <h1>VideoDescription</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.types.<sb>VideoDescription</sb></ref>\n </category-title>\n <subtext>\n <config id=\"VIDEO_CONFIG_DESC\"/>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INPUT_MODE\"/>\n\n <config id=\"ARG_INPUT_MEDIA\"/>\n\n <config id=\"ARG_VIDEO_CONFIG\"/>\n\n <category-title><ref>fps</ref>: <shi>int</shi></category-title>\n <config id=\"VIDEO_FPS_DESC\"/>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Basic Methods/Connect P2P.xml": "<page>\n <p2p-banner/>\n <h1>Connect P2P</h1>\n <config id=\"CONNECT_P2P_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"9-14\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n rtc_servers = ... # Obtain the RTC servers\n dh_config = ... # Obtain the DH configuration\n versions = ... # Obtain the library versions\n p2p_allowed = ... # Obtain whether P2P is allowed\n await app.connect_p2p(\n -1001185324811,\n rtc_servers,\n versions,\n p2p_allowed\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title>\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>connect_p2p</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"CONNECT_P2P_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n <category-title><ref><sb>rtc_servers</sb></ref>: <shi>list</shi>[<docs-ref link=\"/NTgCalls/Available Types/RTCServer\">RTCServer</docs-ref>]</category-title>\n <config id=\"RTC_SERVERS_DESC\"/>\n <category-title><ref><sb>versions</sb></ref>: <shi>list</shi>[<shi>str</shi>]</category-title>\n <config id=\"LIBRARY_VERSIONS_DESC\"/>\n <category-title><ref><sb>p2p_allowed</sb></ref>: <shi>bool</shi></category-title>\n <config id=\"P2P_ALLOWED_DESC\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"P2P_CONN_ERROR\"/>\n <config id=\"CRYPTO_ERROR\"/>\n <category-title>exception <ref>ntgcalls.<sb>SignalingError</sb></ref></category-title>\n <subtext><config id=\"SIGNALING_ERROR_DESC\"/></subtext>\n <category-title>exception <ref>ntgcalls.<sb>SignalingUnsupported</sb></ref></category-title>\n <subtext><config id=\"SIGNALING_UNSUPPORTED_DESC\"/></subtext>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/Connect.xml": "<page>\n <h1>Connect</h1>\n <config id=\"CONNECT_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"8-11\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n ...\n tg_params = ...\n\n await app.connect(\n -1001185324811,\n tg_params,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>connect</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"CONNECT_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n <category-title><ref>params</ref>: <shi>str</shi></category-title>\n <config id=\"TG_PARAMS_DESC\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <category-title>exception <ref>ntgcalls.<sb>ConnectionError</sb></ref></category-title>\n <subtext>\n <text>\n This error occurs when attempting to execute an action on a non-existent Group Call.\n </text>\n </subtext>\n <config id=\"TELEGRAM_EXCEPTION\"/>\n <config id=\"RTMP_EXCEPTION\"/>\n <category-title>exception <ref>ntgcalls.<sb>InvalidParams</sb></ref></category-title>\n <subtext><text>This error occurs when attempting to send invalid Transports.</text></subtext>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/Create Call.xml": "<page>\n <h1>Create Call</h1>\n <config id=\"CREATE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"6-17\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n\n params = await app.create_call(\n -1001185324811,\n MediaDescription(\n AudioDescription(\n input_mode=InputMode.File,\n input=\"audio.pcm\",\n sample_rate=96000,\n bits_per_sample=16,\n channel_count=2,\n ),\n )\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>create_call</sb></ref>() <shi>-> str</shi>\n </category-title>\n <subtext>\n <config id=\"CREATE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n <config id=\"ARG_STREAM_PARAMS\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <category-title>exception <ref>ntgcalls.<sb>ConnectionError</sb></ref></category-title>\n <subtext><text>You are attempting to init an already existent Group Call.</text></subtext>\n <config id=\"NTG_STREAM_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/Create P2P Call.xml": "<page>\n <p2p-banner/>\n <h1>Create P2P Call</h1>\n <config id=\"CREATE_P2P_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"7-19\">\n from ntgcalls import NTgCalls\n ...\n app = NTgCalls()\n dh_config = ... # Obtain the DH configuration\n g_a_hash = ... # Parameter for key exchange (Only when is incoming call)\n params = await app.create_p2p_call(\n -1001185324811,\n config,\n g_a_hash,\n MediaDescription(\n AudioDescription(\n input_mode=InputMode.File,\n input=\"audio.pcm\",\n sample_rate=96000,\n bits_per_sample=16,\n channel_count=2,\n ),\n )\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>create_p2p_call</sb></ref>() <shi>-> bytes</shi>\n </category-title>\n <subtext>\n <config id=\"CREATE_P2P_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n <category-title><ref><sb>config</sb></ref>: <docs-ref link=\"/NTgCalls/Available Types/DhConfig\">DhConfig</docs-ref></category-title>\n <subtext><config id=\"DH_CONFIG_DESC\"/></subtext>\n <category-title><ref><sb>g_a_hash</sb></ref>: <shi>Optional</shi>[<shi>bytes</shi>]</category-title>\n <config id=\"G_A_HASH_DESC\"/>\n <config id=\"ARG_STREAM_PARAMS\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"P2P_CONN_ERROR\"/>\n <config id=\"NTG_STREAM_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/Exchange Keys.xml": "<page>\n <p2p-banner/>\n <h1>Exchange Keys</h1>\n <config id=\"EXCHANGE_KEYS_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"7-11\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n g_a_or_b = ... # Obtain the parameter for key exchange\n fingerprint = ... # Obtain the fingerprint (Optional for outgoing calls)\n params = await app.exchange_keys(\n -1001185324811,\n g_a_or_b,\n fingerprint\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title>\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>exchange_keys</sb></ref>() <shi>-></shi> <docs-ref link=\"/NTgCalls/Available Types/AuthParams\">AuthParams</docs-ref>\n </category-title>\n <subtext>\n <config id=\"EXCHANGE_KEYS_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n <category-title><ref><sb>g_a_or_b</sb></ref>: <shi>bytes</shi></category-title>\n <config id=\"G_A_OR_B_DESC\"/>\n <category-title><ref><sb>fingerprint</sb></ref>: <shi>int</shi></category-title>\n <config id=\"FINGERPRINT_DESC\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"P2P_CONN_ERROR\"/>\n <config id=\"CRYPTO_ERROR\"/>\n <category-title>exception <ref>ntgcalls.<sb>InvalidParams</sb></ref></category-title>\n <subtext><config id=\"MISSING_FINGERPRINT_DESC\"/></subtext>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/Stop.xml": "<page>\n <h1>Stop</h1>\n <config id=\"STOP_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"7-9\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n ...\n\n await app.stop(\n -1001185324811,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>stop</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"STOP_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"NTG_NO_GROUP_CALL\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/ntg_connect.xml": "<page>\n <h1>ntg_connect</h1>\n <config id=\"CONNECT_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"11\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uint32_t uid = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n char* params = ...; // Obtain connection parameters\n ntg_async_struct future;\n // Initialize the async struct\n int result = ntg_connect(uid, chatID, params, &future);\n // Wait for the async operation to complete\n ...\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_connect</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"CONNECT_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n\n <category-title><shi language=\"c\">char*</shi> <ref>params</ref></category-title>\n <config id=\"TG_PARAMS_DESC\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n\n <category-title><ref><sb><shi language=\"c\">#NTG_RTMP_NEEDED</shi></sb></ref> <shi>-300</shi></category-title>\n <subtext><text>This error occurs when attempting to join a group call that requires an RTMP transport.</text></subtext>\n\n <config id=\"INVALID_TRANSPORT_C\"/>\n\n <category-title><ref><sb><shi language=\"c\">#NTG_CONNECTION_FAILED</shi></sb></ref> <shi>-302</shi></category-title>\n <subtext><text>The connection to WebRTC failed.</text></subtext>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/ntg_connect_p2p.xml": "<page>\n <p2p-banner/>\n <h1>ntg_connect_p2p</h1>\n <config id=\"CONNECT_P2P_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"15-24\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uint32_t uid = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n ntg_rtc_server_struct* rtcServers = ...; // Obtain the RTC servers\n int rtcServersCount = ...; // Obtain the count of RTC servers\n char** libraryVersions = ...; // Obtain the library versions\n int libraryVersionCount = ...; // Obtain the count of library versions\n bool p2pAllowed = ...; // Obtain whether P2P is allowed\n ntg_async_struct future;\n // Initialize the async struct\n int result = ntg_connect_p2p(\n uid,\n chatID,\n rtcServers,\n rtcServersCount,\n libraryVersions,\n libraryVersionCount,\n p2pAllowed,\n &future\n );\n // Wait for the async operation to complete\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_connect_p2p</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"CONNECT_P2P_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_rtc_server_struct\">ntg_rtc_server_struct</docs-ref><shi language=\"c\">*</shi> <ref><sb>servers</sb></ref></category-title>\n <config id=\"RTC_SERVERS_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref><sb>serversSize</sb></ref></category-title>\n <subtext><text>Count of list of endpoints</text></subtext>\n <category-title><shi language=\"c\">char**</shi> <ref><sb>versions</sb></ref></category-title>\n <config id=\"LIBRARY_VERSIONS_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref><sb>versionsSize</sb></ref></category-title>\n <subtext><text>Size of the versions array.</text></subtext>\n <category-title><shi language=\"c\">bool</shi> <ref><sb>p2pAllowed</sb></ref></category-title>\n <config id=\"P2P_ALLOWED_DESC\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"CONN_ALREADY_EXISTS_C\"/>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n <config id=\"CRYPTO_ERROR_C\"/>\n <category-title><ref><sb><shi language=\"c\">#NTG_SIGNALING_ERROR</shi></sb></ref> <shi>-104</shi></category-title>\n <subtext><config id=\"SIGNALING_ERROR_DESC\"/></subtext>\n <category-title><ref><sb><shi language=\"c\">#NTG_SIGNALING_UNSUPPORTED</shi></sb></ref> <shi>-105</shi></category-title>\n <subtext><config id=\"SIGNALING_UNSUPPORTED_DESC\"/></subtext>\n <config id=\"INVALID_TRANSPORT_C\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/ntg_create.xml": "<page>\n <h1>ntg_get_params</h1>\n <config id=\"CREATE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"14\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uint32_t uid = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n ntg_media_description_struct desc = {\n // Fill in media description fields\n };\n char buffer[512];\n ntg_async_struct future;\n // Initialize the async struct\n int result = ntg_create(uid, chatID, desc, buffer, sizeof(buffer));\n // Wait for the async operation to complete and\n // use 'buffer' for JoinGroupCall\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_get_params</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"CREATE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <config id=\"ARG_MEDIA_C\"/>\n\n <category-title><shi language=\"c\">char*</shi> <ref>buffer</ref></category-title>\n <subtext>\n <text>\n A string buffer to store the connection parameters retrieved from WebRTC.\n These parameters can be used for <a href=\"https://core.telegram.org/method/phone.joinGroupCall\">JoinGroupCall</a>.\n </text>\n </subtext>\n\n <config id=\"ARG_BUF_SIZE\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_C_EXCEPTIONS\"/>\n <config id=\"SMALL_BUFF_EXCEPTION\"/>\n <config id=\"CONN_ALREADY_EXISTS_C\"/>\n <config id=\"STREAM_C_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/ntg_create_p2p.xml": "<page>\n <p2p-banner/>\n <h1>ntg_create_p2p</h1>\n <config id=\"CREATE_P2P_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"17-27\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uint32_t uid = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n ntg_dh_config_struct dhConfig = ...; // Obtain the DH configuration\n uint8_t* g_a_hash = ...; // Parameter for key exchange (Only when is incoming call)\n int sizeG_A_Hash = ...; // Size of the parameter for key exchange (Only when is incoming call)\n ntg_media_description_struct desc = {\n // Fill in media description fields\n };\n uint8_t* buffer[32];\n ntg_async_struct future;\n // Initialize the async struct\n int result = ntg_create_p2p(\n uid,\n chatID,\n &dhConfig,\n g_a_hash,\n sizeG_A_Hash,\n desc,\n buffer,\n sizeof(buffer),\n &future\n );\n // Wait for the async operation to complete and\n // use 'buffer' for PhoneRequestCall or AcceptCall with Protocol\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_create_p2p</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"CREATE_P2P_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_dh_config_struct\">ntg_dh_config_struct</docs-ref><shi>*</shi> <ref><sb>dhConfig</sb></ref></category-title>\n <subtext><config id=\"DH_CONFIG_DESC\"/></subtext>\n <category-title><shi language=\"c\">uint8_t*</shi> <ref><sb>g_a_hash</sb></ref></category-title>\n <config id=\"G_A_HASH_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref><sb>sizeGAHash</sb></ref></category-title>\n <subtext><text>Size of the parameter for key exchange (Only when is incoming call)</text></subtext>\n <config id=\"ARG_MEDIA_C\"/>\n <category-title><shi language=\"c\">uint8_t*</shi> <ref><sb>buffer</sb></ref></category-title>\n <subtext><text>Buffer to store the result</text></subtext>\n <category-title><shi language=\"c\">int</shi> <ref><sb>sizeBuffer</sb></ref></category-title>\n <subtext><text>Size of the buffer</text></subtext>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n <config id=\"CONN_ALREADY_EXISTS_C\"/>\n <config id=\"STREAM_C_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/ntg_exchange_keys.xml": "<page>\n <p2p-banner/>\n <h1>ntg_exchange_keys</h1>\n <config id=\"EXCHANGE_KEYS_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"14\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uint32_t uid = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n uint8_t* g_a_or_b = ...; // Obtain the parameter for key exchange\n int sizeGAOrB = ...; // Obtain the size of the parameter for key exchange\n int64_t fingerprint = ...; // Obtain the fingerprint\n ntg_auth_params_struct buffer;\n ntg_async_struct future;\n // Initialize the async struct\n int result = ntg_exchange_keys(uid, chatID, g_a_or_b, sizeGAOrB, fingerprint, &buffer, &future);\n // Wait for the async operation to complete\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_exchange_keys</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"EXCHANGE_KEYS_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <category-title><shi language=\"c\">uint8_t*</shi> <ref><sb>g_a_or_b</sb></ref></category-title>\n <config id=\"G_A_OR_B_DESC\"/>\n <category-title><shi language=\"c\">int</shi> <ref><sb>sizeGAOrB</sb></ref></category-title>\n <subtext><text>Size of the parameter for key exchange</text></subtext>\n <category-title><shi language=\"c\">int64_t</shi> <ref><sb>fingerprint</sb></ref></category-title>\n <config id=\"FINGERPRINT_DESC\"/>\n <category-title><docs-ref link=\"/NTgCalls/Available Structs/ntg_auth_params_struct\">ntg_auth_params_struct</docs-ref><shi language=\"c\">*</shi> <ref><sb>authParams</sb></ref></category-title>\n <subtext><config id=\"AUTH_PARAMS_DESC\"/></subtext>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"CONN_ALREADY_EXISTS_C\"/>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n <config id=\"CRYPTO_ERROR_C\"/>\n <category-title><ref><sb><shi language=\"c\">#NTG_MISSING_FINGERPRINT</shi></sb></ref> <shi>-103</shi></category-title>\n <subtext><config id=\"MISSING_FINGERPRINT_DESC\"/></subtext>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Basic Methods/ntg_stop.xml": "<page>\n <h1>ntg_stop</h1>\n <config id=\"STOP_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"11\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uint32_t uid = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n char* params = ...; // Obtain connection parameters\n ntg_async_struct future;\n // Initialize the async struct\n int result = ntg_stop(uid, chatID);\n // Wait for the async operation to complete\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_stop</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"STOP_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Build Guide.xml": "<page>\n <h1>Introduction</h1>\n <text>\n Being a modern library, <b>NTgCalls</b> requires CMake 3.27+ to be built on your system,\n on Linux is required at least CLang 18+ and libx11-dev.\n We recommend using the latest versions of both CMake and CLang.\n </text>\n <alert type=\"important\">\n Before building NTgCalls, check for pre-compiled shared libs on <a href=\"https://github.com/pytgcalls/ntgcalls/releases\">GitHub Releases</a> or\n Python Bindings from <a href=\"https://pypi.org/project/ntgcalls/\">PyPI</a>.\n Building from source may be necessary if pre-compiled packages are not available.\n </alert>\n <separator/>\n <h1>Installing Prerequisites</h1>\n <text>\n Below, we will guide you through the step-by-step process of installing the prerequisites\n required to compile NTgCalls on your operating system.\n </text>\n <subtext>\n <h2>Linux</h2>\n <list style=\"numbers\">\n <item>\n <text>\n <b>Update the system's package list:</b><br/>\n First, make sure you have an updated list of packages:\n </text>\n <syntax-highlight language=\"bash\">\n $ sudo apt update\n </syntax-highlight>\n </item>\n <item>\n <text>\n <b>Build Essential, libx11-dev, Clang 18 and etc:</b><br/>\n This section provides instructions on how to install four specific packages: libx11-dev,\n build-essential, curl and Clang version 18. Use the following command:\n </text>\n <multisyntax id=\"os_requirements\">\n <tabs>\n <tab id=\"x86\">x86_64</tab>\n <tab id=\"arm\">ARM64</tab>\n </tabs>\n <syntax-highlight language=\"bash\" id=\"x86\">\n $ sudo apt install libx11-dev build-essential curl\n </syntax-highlight>\n <syntax-highlight language=\"bash\" id=\"arm\">\n $ sudo apt install libx11-dev build-essential curl\n $ curl -s https://apt.llvm.org/llvm.sh | sudo bash -s -- 18\n </syntax-highlight>\n </multisyntax>\n </item>\n </list>\n <h2>Windows</h2>\n <list style=\"numbers\">\n <item>\n <text>\n <b>Install Microsoft Visual Studio 2019:</b><br/>\n Install Microsoft Visual Studio 2019 with the C++ workload. You can download it from the <a href=\"https://visualstudio.microsoft.com/downloads/\">official website</a>.\n </text>\n </item>\n <item>\n <text>\n <b>Download CMake Installer:</b><br/>\n Download the CMake installer for Windows from the <a href=\"https://cmake.org/download/\">official website</a>.\n </text>\n </item>\n <item>\n <text>\n <b>Run Installer:</b><br/>\n Run the downloaded CMake installer and follow the installation wizard instructions.\n Make sure to select the option to add CMake to the system PATH during installation.\n </text>\n </item>\n </list>\n <h2>macOS</h2>\n <list style=\"numbers\">\n <item>\n <text>\n <b>Install Xcode Command Line Tools:</b><br/>\n If you don't have Xcode installed, you can install the Command Line Tools separately. Open a terminal and run the following command:\n </text>\n <subtext>\n <syntax-highlight language=\"bash\">\n $ xcode-select --install\n </syntax-highlight>\n </subtext>\n </item>\n <item>\n <text>\n <b>Install CMake:</b><br/>\n Open a terminal and run the following command to install CMake:\n </text>\n <subtext>\n <syntax-highlight language=\"bash\">\n $ brew install cmake\n </syntax-highlight>\n </subtext>\n </item>\n </list>\n </subtext>\n <separator/>\n <h1>Cloning and Building</h1>\n <text>\n In this section, you'll learn how to clone the NTgCalls repository and build the library from source.\n </text>\n <subtext>\n <h2>Cloning the Repo</h2>\n <text>\n To begin building NTgCalls from source, you need to clone the GitHub repository. Follow these steps to clone the repo:\n </text>\n <list style=\"numbers\">\n <item>\n <text>\n <b>Change to the Directory Where You Want to Clone the Repo:</b><br/>\n Navigate to the directory where you want to store the NTgCalls source code. You can use the `cd` command to change directories.\n </text>\n <syntax-highlight language=\"bash\">\n $ cd /path/to/your/directory\n </syntax-highlight>\n </item>\n <item>\n <text>\n <b>Clone the NTgCalls Repository:</b><br/>\n Use the following command to clone the NTgCalls GitHub repository:\n </text>\n <syntax-highlight language=\"bash\">\n $ git clone https://github.com/pytgcalls/ntgcalls.git --recursive\n </syntax-highlight>\n </item>\n </list>\n <h2>Compilation</h2>\n <text>\n Now that you have successfully installed all the required prerequisites for NTgCalls,\n it's time to build the library.\n Follow these steps to compile NTgCalls on your system.\n </text>\n <alert type=\"important\">\n It's essential to have Python 3.8+ installed on your server.\n </alert>\n <subtext>\n <h3>Building Shared Library</h3>\n <text>\n For developers looking to use NTgCalls with C and C++, we provide C Bindings.\n Follow these steps to compile NTgCalls with C Bindings in either Release or Debug mode:\n </text>\n <list style=\"numbers\">\n <item>\n <text>\n <b>Change Directory:</b><br/>\n Navigate to the root directory of the NTgCalls project:\n </text>\n <syntax-highlight language=\"bash\">\n $ cd /path/to/ntgcalls\n </syntax-highlight>\n </item>\n <item>\n <text>\n <b>Generate Library:</b><br/>\n Run the following command to generate the libraries:\n </text>\n <multisyntax id=\"build_type\">\n <tabs>\n <tab id=\"debug\">Debug</tab>\n <tab id=\"release\">Release</tab>\n </tabs>\n <syntax-highlight language=\"bash\" id=\"debug\">\n # Shared\n $ python3 setup.py build_lib --debug\n # Static\n $ python3 setup.py build_lib --debug --static\n </syntax-highlight>\n <syntax-highlight language=\"bash\" id=\"release\">\n # Shared\n $ python3 setup.py build_lib\n # Static\n $ python3 setup.py build_lib --static\n </syntax-highlight>\n </multisyntax>\n </item>\n </list>\n <br/>\n <h3>Building Python Bindings</h3>\n <text>\n NTgCalls offers Python Bindings, facilitating seamless integration with Python.\n Follow these steps to compile NTgCalls with Python Bindings:\n </text>\n <list style=\"numbers\">\n <item>\n <text>\n <b>Change Directory:</b><br/>\n Navigate to the root directory of the NTgCalls project:\n </text>\n <syntax-highlight language=\"bash\">\n $ cd /path/to/ntgcalls\n </syntax-highlight>\n </item>\n <item>\n <text>\n <b>Install Python Bindings:</b><br/>\n Run the following command to install the Python Bindings:\n </text>\n <syntax-highlight language=\"bash\">\n $ pip3 install . -U\n </syntax-highlight>\n </item>\n </list>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Callback Registration.xml": "<page>\n <h1>Callback Registration</h1>\n <text>\n Callbacks registration allows you to specify custom functions to be executed when specific\n events occur or conditions are met within your application.\n These events might include changes in call status, media state updates, or other critical moments in\n the NTgCalls library's operation.\n </text>\n <alert type=\"note\">\n When registering callbacks, keep in mind that each registration replaces the previously set callback.\n </alert>\n <separator/>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\"><sb>ntg_on_stream_end</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_END_DESC\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n <category-title><shi language=\"c\">ntg_stream_callback</shi> <ref><sb>callback</sb></ref></category-title>\n <subtext><text>The callback function to be executed when the stream ends.</text></subtext>\n <config id=\"ARG_CUSTOM_DATA\"/>\n </subtext>\n </category>\n <br/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include \"ntgcalls.h\"\n ...\n void myStreamEndCallback(uint32_t uid, int64_t chatID, ntg_stream_type_enum type, void *data) {\n // Your callback logic here\n }\n ...\n int main() {\n uint32_t uid = ntg_init();\n ... // Your Code Here\n ntg_on_stream_end(uid, myStreamEndCallback, customData);\n ...\n return 0;\n }\n </syntax-highlight>\n </subtext>\n <separator/>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\"><sb>ntg_on_upgrade</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_UPGRADE_DESC\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n <category-title><shi language=\"c\">ntg_upgrade_callback</shi> <ref><sb>callback</sb></ref></category-title>\n <subtext><text>The callback function to be executed when the stream needs to update MTProto stream parameters.</text></subtext>\n <config id=\"ARG_CUSTOM_DATA\"/>\n </subtext>\n </category>\n <br/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include \"ntgcalls.h\"\n ...\n void myOnUpgradeCallback(uint32_t uid, int64_t chatID, ntg_media_state_struct mediaState, void *data) {\n // Your callback logic here\n }\n ...\n int main() {\n uint32_t uid = ntg_init();\n ... // Your Code Here\n ntg_on_upgrade(uid, myOnUpgradeCallback, customData);\n ...\n return 0;\n }\n </syntax-highlight>\n </subtext>\n <separator/>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\"><sb>ntg_on_connection_change</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_CONN_CHANGE_DESC\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n <category-title><shi language=\"c\">ntg_connection_callback</shi> <ref><sb>callback</sb></ref></category-title>\n <subtext><text>The callback function to be executed when the connection state changes.</text></subtext>\n <config id=\"ARG_CUSTOM_DATA\"/>\n </subtext>\n </category>\n <br/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include \"ntgcalls.h\"\n ...\n void myOnConnectionChangeCallback(uint32_t uid, int64_t chatID, ntg_connection_state_enum state, void *data) {\n // Your callback logic here\n }\n ...\n int main() {\n uint32_t uid = ntg_init();\n ... // Your Code Here\n ntg_on_connection_change(uid, myOnConnectionChangeCallback, customData);\n ...\n return 0;\n }\n </syntax-highlight>\n </subtext>\n <separator/>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\"><sb>ntg_on_signaling_data</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_SIGNALING_DESC\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n <category-title><shi language=\"c\">ntg_signaling_callback</shi> <ref><sb>callback</sb></ref></category-title>\n <subtext><text>The callback function to be executed when signaling data is received.</text></subtext>\n <config id=\"ARG_CUSTOM_DATA\"/>\n </subtext>\n </category>\n <br/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include \"ntgcalls.h\"\n ...\n void myOnSignalingDataCallback(uint32_t uid, int64_t chatID, const char *data, size_t size, void *customData) {\n // Your callback logic here\n }\n ...\n int main() {\n uint32_t uid = ntg_init();\n ... // Your Code Here\n ntg_on_signaling_data(uid, myOnSignalingDataCallback, customData);\n ...\n return 0;\n }\n </syntax-highlight>\n </subtext>\n <separator/>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\"><sb>ntg_register_logger</sb></ref>()</category-title>\n <subtext>\n <config id=\"REGISTER_LOGGER_DESC\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><shi language=\"c\">ntg_log_message_callback</shi> <ref><sb>callback</sb></ref></category-title>\n <subtext><config id=\"LOGGER_DESC\"/></subtext>\n </subtext>\n </category>\n <br/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"9\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n void logger(ntg_log_message_struct* message) {\n printf(\"Log message: %s\\n\", message->message);\n }\n\n int main() {\n ntg_register_logger(logger);\n ...\n return 0;\n }\n </syntax-highlight>\n </subtext>\n </category>\n</page>","/NTgCalls/Callbacks.xml": "<page>\n <h1>Callbacks</h1>\n <text>\n Callbacks allows you to define custom behavior or actions that should be triggered in response to specific\n events or conditions within your application.\n These events could include call-related occurrences, state changes, or other interactions with the NTgCalls library.\n </text>\n <br/>\n <category>\n <category-title><ref src=\"method\">NTgCalls.<sb>on_stream_end</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_END_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"4-7\">\n ...\n app = NTgCalls()\n ...\n def handler(chat_id: int, update: StreamType):\n print(chat_id, update)\n ...\n app.on_stream_end(handler)\n </syntax-highlight>\n </subtext>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\">NTgCalls.<sb>on_upgrade</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_UPGRADE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"4-7\">\n ...\n app = NTgCalls()\n ...\n def handler(chat_id: int, update: MediaState):\n print(chat_id, update)\n ...\n app.on_upgrade(handler)\n </syntax-highlight>\n </subtext>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\">NTgCalls.<sb>on_connection_change</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_CONN_CHANGE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"4-7\">\n ...\n app = NTgCalls()\n ...\n def handler(chat_id: int, state: ConnectionState):\n print(chat_id, state)\n ...\n app.on_connection_change(handler)\n </syntax-highlight>\n </subtext>\n </category>\n <br/><br/>\n <category>\n <category-title><ref src=\"method\">NTgCalls.<sb>on_signaling</sb></ref>()</category-title>\n <subtext>\n <config id=\"CALLBACK_SIGNALING_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"4-7\">\n ...\n app = NTgCalls()\n ...\n def handler(chat_id: int, payload: bytes):\n print(chat_id, payload)\n ...\n app.on_signaling(handler)\n </syntax-highlight>\n </subtext>\n </category>\n</page>","/NTgCalls/Client.xml": "<page>\n <h1>NTgCalls Client</h1>\n <text>\n Welcome to the API Reference section, where you'll find comprehensive information about the NTgCalls API.\n This is your gateway to in-depth details about the main Client class, its methods, types,\n all of which play a crucial role in utilizing NTgCalls effectively.\n </text>\n <h3>Example</h3>\n <syntax-highlight mark=\"1-3\">\n from ntgcalls import NTgCalls\n\n app = NTgCalls()\n print(app.ping())\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">ntgcalls.<sb>NTgCalls</sb></ref>\n </category-title>\n <subtext>\n <text>The NTgCalls Client is your primary interface for seamless interaction with Group Calls.</text>\n <br/>\n <category>\n <pg-title>STATIC METHODS</pg-title>\n <subtext>\n <category-title><ref><shi>async</shi> <sb>calls</sb></ref>() <shi>-> dict</shi>[<shi>int</shi>, <docs-ref link=\"/NTgCalls/Available Enums/StreamStatus\">ntgcalls.StreamStatus</docs-ref>]</category-title>\n <config id=\"LIST_CALLS_DESC\"/>\n\n <category-title><ref><shi>async</shi> <sb>cpu_usage</sb></ref>() <shi>-></shi> <shi>float</shi></category-title>\n <subtext><config id=\"CPU_USAGE_DESC\"/></subtext>\n\n <category-title><ref><sb>ping</sb></ref>() <shi>-></shi> <shi>str</shi></category-title>\n <subtext><text>Return \"pong\" message when calling this method</text></subtext>\n\n <category-title><ref><sb>get_protocol</sb></ref>() <shi>-></shi> <docs-ref link=\"/NTgCalls/Available Types/Protocol\">ntgcalls.Protocol</docs-ref></category-title>\n <subtext><config id=\"GET_PROTOCOL_DESC\"/></subtext>\n </subtext>\n </category>\n </subtext>\n </category>\n</page>","/NTgCalls/Getting Started.xml": "<page>\n <h1>Getting Started</h1>\n <text>\n This section provides documentation for the NTgCalls C API, which allows you to use NTgCalls in various programming languages,\n including C, C++, Go, Rust, Deno, and more.\n Below, you will find detailed information about the initialization and cleanup functions.\n </text>\n <separator/>\n <h2>Initialization</h2>\n <text>\n To get started with NTgCalls in your application, you need to initialize the library using the <code>ntg_init</code> function.\n This function sets up the necessary resources and prepares NTgCalls for use.\n </text>\n <alert type=\"important\">\n Make sure to call <code>ntg_init</code> before using any other NTgCalls functions.\n </alert>\n <subtext>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"4\">\n #include \"ntgcalls.h\"\n\n int main() {\n uint32_t uid = ntg_init();\n\n ... // Your Code Here\n return 0;\n }\n </syntax-highlight>\n </subtext>\n\n <h2>Cleanup</h2>\n <text>\n To clean up and release the resources used by NTgCalls, you should call the <code>ntg_destroy</code> function.\n This function deallocates memory and performs necessary cleanup operations.\n </text>\n <alert type=\"warning\">\n Always call <code>ntg_destroy</code> when you are done using NTgCalls to prevent memory leaks and resource issues.\n </alert>\n <subtext>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"7\">\n #include \"ntgcalls.h\"\n\n int main() {\n uint32_t uid = ntg_init();\n ... // Your Code Here\n\n int result = ntg_destroy(uid);\n if (result != 0) {\n printf(\"NTgCalls cleanup failed.\\n\");\n return 1;\n }\n return 0;\n }\n </syntax-highlight>\n </subtext>\n\n <separator/>\n <h2>Library Version</h2>\n <text>\n You can retrieve the version of the NTgCalls library currently in use using the <code>ntg_get_version</code> function.\n This function returns a string containing the version number.\n </text>\n <subtext>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"6\">\n #include \"ntgcalls.h\"\n #include <stdio.h>\n\n int main() {\n char version[8];\n ntg_get_version(version, sizeof(version));\n printf(\"NTgCalls Version: %s\\n\", version);\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <br/>\n <h3>Details</h3>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb>ntg_get_version</sb></ref>()\n </category-title>\n <subtext>\n <text>Retrieve library version</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><shi language=\"c\">char*</shi> <ref>buffer</ref></category-title>\n <subtext><text>A character buffer to store the version string.</text></subtext>\n\n <config id=\"ARG_BUF_SIZE\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"SMALL_BUFF_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n </subtext>\n</page>","/NTgCalls/Quick Start.xml": "<page>\n <h1>Quick Start</h1>\n <text>\n Welcome to this section, which is primarily intended for developers who are moderately experienced or\n seeking to perform a porting in their language using C bindings. If you are new to Python development,\n we strongly recommend using <docs-ref link=\"/PyTgCalls\">Py-TgCalls</docs-ref>.\n However, if you fall into the aforementioned categories,\n you can find an example of usage with the various porting below.\n </text>\n <h2>Community and Official Libraries</h2>\n <text>\n In the following section, we present a comprehensive catalog of libraries,\n thoughtfully crafted by the community and officially endorsed,\n all of which leverage the robust capabilities of NTgCalls.\n </text>\n <br/>\n <github-ref user=\"pytgcalls\" reponame=\"pytgcalls\"/>\n <github-ref user=\"roj1512\" reponame=\"ntgcalls_deno\"/>\n <github-ref user=\"YouKnow-sys\" reponame=\"ntgcalls-rs\"/>\n <h2>Enjoy the API</h2>\n <text>\n What we've just seen are simplified ports of NTgCalls. However, now let's delve deeper!\n In the upcoming pages, we'll explore NTgCalls in a step-by-step manner,\n covering how it functions, how to install it, and more.\n\n Are you feeling eager to continue?\n You can take a shortcut to the Call Methods\n section and return later to delve into more details.\n </text>\n</page>","/NTgCalls/Stream Methods/Change Stream.xml": "<page>\n <h1>Change Stream</h1>\n <config id=\"CHANGE_STREAM_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"6-17\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n\n await app.change_stream(\n -1001185324811,\n MediaDescription(\n AudioDescription(\n input_mode=InputMode.File,\n input=\"foxes.pcm\",\n sample_rate=96000,\n bits_per_sample=16,\n channel_count=2,\n ),\n )\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>change_stream</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"CHANGE_STREAM_DESC_2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n <config id=\"ARG_STREAM_PARAMS\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"NTG_NO_GROUP_CALL\"/>\n <config id=\"NTG_STREAM_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/Mute.xml": "<page>\n <h1>Mute</h1>\n <config id=\"MUTE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"7-9\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n ...\n\n await app.mute(\n -1001185324811,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>mute</sb></ref>() <shi>-> bool</shi>\n </category-title>\n <subtext>\n <config id=\"MUTE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"NTG_NO_GROUP_CALL\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/Pause.xml": "<page>\n <h1>Pause</h1>\n <config id=\"PAUSE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"7-9\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n ...\n\n await app.pause(\n -1001185324811,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>pause</sb></ref>() <shi>-> bool</shi>\n </category-title>\n <subtext>\n <config id=\"PAUSE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"NTG_NO_GROUP_CALL\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/Resume.xml": "<page>\n <h1>Resume</h1>\n <config id=\"RESUME_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"7-9\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n ...\n\n await app.resume(\n -1001185324811,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>resume</sb></ref>() <shi>-> bool</shi>\n </category-title>\n <subtext>\n <config id=\"RESUME_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"NTG_NO_GROUP_CALL\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/Time.xml": "<page>\n <h1>Time</h1>\n <config id=\"TIME_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"7-9\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls(client)\n\n print(\n await app.time(\n -1001185324811,\n )\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>time</sb></ref>() <shi>-> int</shi>\n </category-title>\n <subtext>\n <config id=\"TIME_DESC_2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"NTG_NO_GROUP_CALL\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/UnMute.xml": "<page>\n <h1>UnMute</h1>\n <config id=\"UNMUTE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"7-9\">\n from ntgcalls import NTgCalls\n ...\n\n app = NTgCalls()\n ...\n\n await app.unmute(\n -1001185324811,\n )\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <shi>async</shi> <ref src=\"method\">NTgCalls.<sb>unmute</sb></ref>() <shi>-> bool</shi>\n </category-title>\n <subtext>\n <config id=\"UNMUTE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"NTG_NO_GROUP_CALL\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/ntg_change_stream.xml": "<page>\n <h1>ntg_change_stream</h1>\n <config id=\"CHANGE_STREAM_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"13\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uint32_t uid = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n ntg_media_description_struct desc = {\n // Fill in updated media description fields\n };\n ntg_async_struct future;\n // Initialize the async struct\n int result = ntg_change_stream(uid, chatID, desc, &future);\n // Wait for the async operation to complete\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_change_stream</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"CHANGE_STREAM_DESC_2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <config id=\"ARG_MEDIA\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n\n <config id=\"STREAM_C_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/ntg_mute.xml": "<page>\n <h1>ntg_mute</h1>\n <config id=\"MUTE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uint32_t uid = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n ntg_async_struct future;\n // Initialize the async struct\n int errCode = ntg_mute(uid, chatID, &future);\n // Wait for the async operation to complete\n if (future.errorCode == 0) {\n printf(\"Audio muted.\\n\");\n } else if (future.errorCode == 1) {\n printf(\"Audio was already muted.\\n\");\n } else {\n printf(\"Failed to mute audio (Error code: %d).\\n\", future.errorCode);\n return 1;\n }\n ... // Your Code Here\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_mute</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"MUTE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/ntg_pause.xml": "<page>\n <h1>ntg_pause</h1>\n <config id=\"PAUSE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uint32_t uid = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n ntg_async_struct future;\n // Initialize the async struct\n int errCode = ntg_pause(uid, chatID);\n // Wait for the async operation to complete\n if (future.errorCode == 0) {\n printf(\"Audio paused.\\n\");\n } else if (future.errorCode == 1) {\n printf(\"Audio was already paused.\\n\");\n } else {\n printf(\"Failed to pause audio (Error code: %d).\\n\", result);\n return 1;\n }\n ... // Your Code Here\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_pause</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"PAUSE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/ntg_resume.xml": "<page>\n <h1>ntg_resume</h1>\n <config id=\"RESUME_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uint32_t uid = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n ntg_async_struct future;\n // Initialize the async struct\n int errCode = ntg_resume(uid, chatID, &future);\n // Wait for the async operation to complete\n if (future.errorCode == 0) {\n printf(\"Audio resumed.\\n\");\n } else if (future.errorCode == 1) {\n printf(\"Audio was already resumed.\\n\");\n } else {\n printf(\"Failed to resume audio (Error code: %d).\\n\", result);\n return 1;\n }\n ... // Your Code Here\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_resume</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"RESUME_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/ntg_time.xml": "<page>\n <h1>ntg_time</h1>\n <config id=\"TIME_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"11\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uint32_t uid = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n int64_t time = 0;\n ntg_async_struct future;\n // Initialize the async struct\n int64_t result = ntg_time(uid, chatID, &time, &future);\n // Wait for the async operation to complete\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int64_t</shi> <sb src=\"method\">ntg_time</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"TIME_DESC_2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <category-title><shi language=\"c\">int64_t*</shi> <ref><sb>time</sb></ref></category-title>\n <subtext>The playback time in seconds.</subtext>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Stream Methods/ntg_unmute.xml": "<page>\n <h1>ntg_unmute</h1>\n <config id=\"UNMUTE_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight language=\"c\" mark=\"10\">\n #include <stdint.h>\n #include \"ntgcalls.h\"\n\n int main() {\n uint32_t uid = ntg_init();\n ...\n int64_t chatID = ...; // Obtain the chat ID\n ntg_async_struct future;\n // Initialize the async struct\n int errCode = ntg_unmute(uid, chatID, &future);\n // Wait for the async operation to complete\n if (future.errorCode == 0) {\n printf(\"Audio unmuted.\\n\");\n } else if (future.errorCode == 1) {\n printf(\"Audio was already unmuted.\\n\");\n } else {\n printf(\"Failed to unmute audio (Error code: %d).\\n\", future.errorCode);\n return 1;\n }\n ... // Your Code Here\n return 0;\n }\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref><shi language=\"c\">int</shi> <sb src=\"method\">ntg_unmute</sb></ref>()\n </category-title>\n <subtext>\n <config id=\"UNMUTE_DESC2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_C_UID\"/>\n <config id=\"ARG_C_CHAT_ID\"/>\n <config id=\"ARG_ASYNC_STRUCT\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_SYNC_C_EXCEPTION\"/>\n </subtext>\n <br/>\n <pg-title>ASYNC ERROR CODES</pg-title>\n <subtext>\n <config id=\"BASE_CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/NTgCalls/Using Async.xml": "<page>\n <h1>Using Async</h1>\n <text>\n NTgCalls starting from version 1.2.0 supports asynchronous calls to function using <code>ntg_async_struct</code>,\n which contains <code>userData</code> that can be used to pass data between the caller and the callback,\n <code>promise</code> that is called when the operation is completed, and <code>error</code> that is set\n when an error occurs, but by default it is set to <shi language=\"c\">#NTG_ASYNC_NOT_READY</shi> (-4) until\n the operation is completed.\n </text>\n <separator/>\n <h2>Async Call in a Sync way</h2>\n <text>\n To make an async call in a sync way, you can use a mutex to wait for the operation to complete:\n </text>\n <syntax-highlight language=\"cpp\">\n #include <ntgcalls.h>\n #include <mutex>\n\n void onCallReady(void* data) {\n ((std::mutex*)data)->unlock();\n }\n\n void makeAsyncCall() {\n ntg_async_struct asyncData;\n std::mutex mtx;\n asyncData.userData = &mtx;\n asyncData.promise = onCallReady;\n mutex.lock();\n int error = ntg_pause(asyncData);\n if (error != 0) {\n // Handle error\n }\n mutex.lock();\n // Async operation completed\n if (asyncData.errorCode != 0) {\n // Handle Async error\n }\n }\n </syntax-highlight>\n <separator/>\n <h2>Async Call with custom data</h2>\n <text>\n You can pass custom data to the async call by using the <code>userData</code> field:\n </text>\n <syntax-highlight language=\"cpp\">\n #include <ntgcalls.h>\n #include <mutex>\n #include <iostream>\n\n struct CustomData {\n std::mutex* mtx;\n int64_t chatID;\n };\n\n void onCallReady(void* data) {\n CustomData* customData = (CustomData*)data;\n customData->mtx->unlock();\n std::cout << \"Chat ID: \" << customData->chatID << std::endl;\n }\n\n void makeAsyncCall() {\n ntg_async_struct asyncData;\n std::mutex mtx;\n CustomData data;\n data.mtx = &mtx;\n data.chatID = 1234567890;\n asyncData.userData = &data;\n asyncData.promise = onCallReady;\n mutex.lock();\n int error = ntg_pause(asyncData);\n if (error != 0) {\n // Handle error\n }\n mutex.lock();\n // Async operation completed\n if (asyncData.errorCode != 0) {\n // Handle Async error\n }\n }\n </syntax-highlight>\n</page>","/PyTgCalls/Advanced Methods/Change Volume Call.xml": "<page>\n <h1>Change Volume Call</h1>\n <alert type=\"warning\">\n This feature has some Telegram bugs; sometimes the volume is not applied on the Client side.\n </alert>\n <text>This method changes the userbot\u2019s output volume using MTProto APIs.</text>\n <h3>Example</h3>\n <syntax-highlight mark=\"10-13\">\n from pytgcalls import Client\n from pytgcalls import idle\n ...\n\n app = PyTgCalls(client)\n app.start()\n\n ... # Call API methods\n\n app.change_volume_call(\n -1001185324811,\n 175,\n )\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>change_volume_call</sb></ref>()\n </category-title>\n <subtext>\n <text>Change the stream\u2019s volume.</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n\n <category-title><ref>volume</ref>: <shi>int</shi></category-title>\n <subtext><text>New stream\u2019s volume</text></subtext>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Advanced Methods/Get Participants.xml": "<page>\n <h1>Get Participants</h1>\n <text>This method returns the list of a group call\u2019s participants using MTProto APIs.</text>\n <h3>Example</h3>\n <syntax-highlight mark=\"10-12\">\n from pytgcalls import Client\n from pytgcalls import idle\n ...\n\n app = PyTgCalls(client)\n app.start()\n\n ... # Call API methods\n\n app.get_participants(\n -1001185324811,\n )\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>get_participants</sb></ref>() <shi>-> list</shi>[<docs-ref link=\"/PyTgCalls/Advanced Types/GroupCall\">GroupCall</docs-ref>]\n </category-title>\n <subtext>\n <text>Get a list of participants from a group call</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Advanced Types/Call.xml": "<page>\n <h1>Call</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>Call</sb></ref>\n </category-title>\n <subtext>\n <config id=\"CALL_DESC\"/>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><ref><sb>call_type</sb></ref> -> <docs-ref link=\"/PyTgCalls/Available Enums/Call Type\">Type</docs-ref></category-title>\n <subtext><text>The type of the call.</text></subtext>\n\n <category-title><ref><sb>status</sb></ref> -> <docs-ref link=\"/PyTgCalls/Available Enums/Call Status\">Status</docs-ref></category-title>\n <config id=\"STREAM_STATUS_DESC2\"/>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Advanced Types/CallConfig.xml": "<page>\n <h1>CallConfig</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>CallConfig</sb></ref>\n </category-title>\n <subtext>\n <text>Configuration descriptor for a private call</text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>timeout</ref>: <shi>int</shi></category-title>\n <subtext><text>Timeout for an answer from the user</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Advanced Types/ChatUpdate.xml": "<page>\n <h1>ChatUpdate</h1>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>ChatUpdate</sb></ref>\n </category-title>\n <subtext>\n <text>Represents a chat update.</text>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <config id=\"RET_INT_ID\"/>\n <category-title><ref>status</ref> -> <docs-ref link=\"/PyTgCalls/Available Enums/ChatUpdate Status\">Status</docs-ref></category-title>\n <subtext><text>Status of the chat.</text></subtext>\n <category-title><ref>action</ref> -> <shi>Any</shi></category-title>\n <subtext><text>Action of the chat.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Advanced Types/GroupCallConfig.xml": "<page>\n <h1>GroupCallConfig</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>GroupCallConfig</sb></ref>\n </category-title>\n <subtext>\n <text>Configuration descriptor for a group call</text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>invite_hash</ref>: Optional[<shi>str</shi>]</category-title>\n <subtext><text>Unique identifier for a group call invite in t.me link form</text></subtext>\n <category-title><ref>join_as</ref>: <config id=\"ARG_UNION_PEER\"/></category-title>\n <subtext><text>InputPeer to join as a channel or a profile</text></subtext>\n <category-title><ref>auto_start</ref>: <shi>bool</shi></category-title>\n <subtext><text>Start group call if not present, by default, is True</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Advanced Types/GroupCallParticipant.xml": "<page>\n <h1>GroupCallParticipant</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>GroupCallParticipant</sb></ref>\n </category-title>\n <subtext>\n <text>Info about a group call participant</text>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <category-title><ref><sb>user_id</sb></ref> <shi>-> int</shi></category-title>\n <subtext><text>Unique identifier of a participant.</text></subtext>\n\n <category-title><ref><sb>muted</sb></ref> <shi>-> bool</shi></category-title>\n <subtext><text>Whether the participant is muted.</text></subtext>\n\n <category-title><ref><sb>muted_by_admin</sb></ref> <shi>-> bool</shi></category-title>\n <subtext><text>Whether an admin has muted the participant.</text></subtext>\n\n <category-title><ref><sb>video</sb></ref> <shi>-> bool</shi></category-title>\n <subtext><text>Whether the participant is currently broadcasting a video stream.</text></subtext>\n\n <category-title><ref><sb>screen_sharing</sb></ref> <shi>-> bool</shi></category-title>\n <subtext><text>Whether the participant is currently screen sharing.</text></subtext>\n\n <category-title><ref><sb>video_camera</sb></ref> <shi>-> bool</shi></category-title>\n <subtext><text>Whether the participant is currently broadcasting a video camera.</text></subtext>\n\n <category-title><ref><sb>raised_hand</sb></ref> <shi>-> bool</shi></category-title>\n <subtext><text>Whether the participant has raised the hand.</text></subtext>\n\n <category-title><ref><sb>volume</sb></ref> <shi>-> int</shi></category-title>\n <subtext><text>Volume level of the participant.</text></subtext>\n\n <category-title><ref><sb>action</sb></ref> <shi>-></shi> <docs-ref link=\"/PyTgCalls/Available Enums/GroupCallParticipant Action\">Action</docs-ref></category-title>\n <subtext><text>Current action of the participant.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Advanced Types/StreamAudioEnded.xml": "<page>\n <h1>StreamAudioEnded</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>StreamAudioEnded</sb></ref>\n </category-title>\n <subtext>\n <text>The audio stream has ended.</text>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <config id=\"RET_INT_ID\"/>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Advanced Types/StreamVideoEnded.xml": "<page>\n <h1>StreamVideoEnded</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>StreamVideoEnded</sb></ref>\n </category-title>\n <subtext>\n <text>The video stream has ended.</text>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <config id=\"RET_INT_ID\"/>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Advanced Types/UpdatedGroupCallParticipant.xml": "<page>\n <h1>UpdatedGroupCallParticipant</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>UpdatedGroupCallParticipant</sb></ref>\n </category-title>\n <subtext>\n <text>A participant changed his status.</text>\n <br/>\n <pg-title>PROPERTIES</pg-title>\n <subtext>\n <config id=\"RET_INT_ID\"/>\n <config id=\"ARG_PARTICIPANT\"/>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Available Enums/AudioQuality.xml": "<page>\n <h1>AudioQuality</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"enum\">pytgcalls.types.<sb>AudioQuality</sb></ref>\n </category-title>\n <subtext>\n <text>Enumeration of audio quality settings for audio streams in telegram calls.</text>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>STUDIO</sb></ref> <shi>=</shi> (96000, 2)</category-title>\n <subtext><text>Represents studio-quality audio with a bitrate of 96000 and 2 channels.</text></subtext>\n\n <category-title><ref><sb>HIGH</sb></ref> <shi>=</shi> (48000, 2)</category-title>\n <subtext><text>Represents high-quality audio with a bitrate of 48000 and 2 channels.</text></subtext>\n\n <category-title><ref><sb>MEDIUM</sb></ref> <shi>=</shi> (36000, 1)</category-title>\n <subtext><text>Represents medium-quality audio with a bitrate of 36000 and 1 channel.</text></subtext>\n\n <category-title><ref><sb>LOW</sb></ref> <shi>=</shi> (24000, 1)</category-title>\n <subtext><text>Represents low-quality audio with a bitrate of 24000 and 1 channel.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Available Enums/Call Status.xml": "<page>\n <h1>Call Status</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"enum\">pytgcalls.types.Call.<sb>Status</sb></ref>\n </category-title>\n <subtext>\n <text>Enumeration for managing call statuses.</text>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>PLAYING</sb></ref> <shi>=</shi> 1</category-title>\n <subtext><text>Indicates that the call is playing.</text></subtext>\n <category-title><ref><sb>PAUSED</sb></ref> <shi>=</shi> 2</category-title>\n <subtext><text>Indicates that the call is paused.</text></subtext>\n <category-title><ref><sb>IDLE</sb></ref> <shi>=</shi> 4</category-title>\n <subtext><text>Indicates that the call is idle.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Available Enums/Call Type.xml": "<page>\n <h1>Call Type</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"enum\">pytgcalls.types.Call.<sb>Type</sb></ref>\n </category-title>\n <subtext>\n <text>Enumeration for managing call types.</text>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>GROUP</sb></ref> <shi>=</shi> 1</category-title>\n <subtext><text>Group call type.</text></subtext>\n <category-title><ref><sb>PRIVATE</sb></ref> <shi>=</shi> 2</category-title>\n <subtext><text>Private call type.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Available Enums/ChatUpdate Status.xml": "<page>\n <h1>ChatUpdate Status</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"enum\">pytgcalls.types.ChatUpdate.<sb>Status</sb></ref>\n </category-title>\n <subtext>\n <text>Enumeration for managing chat update status in telegram calls.</text>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>KICKED</sb></ref> <shi>=</shi> 1</category-title>\n <subtext><text>Indicates that you was kicked.</text></subtext>\n <category-title><ref><sb>LEFT_GROUP</sb></ref> <shi>=</shi> 2</category-title>\n <subtext><text>Indicates that you left the chat.</text></subtext>\n <category-title><ref><sb>CLOSED_VOICE_CHAT</sb></ref> <shi>=</shi> 4</category-title>\n <subtext><text>Indicates that the voice chat was closed.</text></subtext>\n <category-title><ref><sb>INVITED_VOICE_CHAT</sb></ref> <shi>=</shi> 8</category-title>\n <subtext><text>Indicates that you was invited to the voice chat.</text></subtext>\n <category-title><ref><sb>DISCARDED_CALL</sb></ref> <shi>=</shi> 16</category-title>\n <subtext><text>Indicates that the call was discarded.</text></subtext>\n <category-title><ref><sb>INCOMING_CALL</sb></ref> <shi>=</shi> 32</category-title>\n <subtext><text>Indicates that an incoming call is available.</text></subtext>\n <category-title><ref><sb>LEFT_CALL</sb></ref> <shi>=</shi> KICKED | LEFT_GROUP | CLOSED_VOICE_CHAT | DISCARDED_CALL</category-title>\n <subtext><text>Indicates that you left the call.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Available Enums/GroupCallParticipant Action.xml": "<page>\n <h1>GroupCallParticipant Action</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"enum\">pytgcalls.types.GroupCallParticipant.<sb>Action</sb></ref>\n </category-title>\n <subtext>\n <text>Enumeration of actions for group call participants.</text>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>JOINED</sb></ref> <shi>=</shi> 1</category-title>\n <subtext><text>Represents a participant joined in a group call.</text></subtext>\n\n <category-title><ref><sb>LEFT</sb></ref> <shi>=</shi> 2</category-title>\n <subtext><text>Represents a participant left a group call.</text></subtext>\n\n <category-title><ref><sb>UPDATED</sb></ref> <shi>=</shi> 4</category-title>\n <subtext><text>Represents a participant updated in a group call.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Available Enums/MediaStream Flags.xml": "<page>\n <h1>MediaStream Flags</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"enum\">pytgcalls.types.MediaStream.<sb>Flags</sb></ref>\n </category-title>\n <subtext>\n <text>Enumeration for managing media stream requirements in telegram calls.</text>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>AUTO_DETECT</sb></ref> <shi>=</shi> 1</category-title>\n <subtext><text>Automatically detects the presence of the stream.</text></subtext>\n\n <category-title><ref><sb>IGNORE</sb></ref> <shi>=</shi> 2</category-title>\n <subtext><text>Ignores the stream.</text></subtext>\n\n <category-title><ref><sb>REQUIRED</sb></ref> <shi>=</shi> 4</category-title>\n <subtext><text>Indicates that the stream is mandatory.</text></subtext>\n\n <category-title><ref><sb>NO_LATENCY</sb></ref> <shi>=</shi> 8</category-title>\n <subtext><text>Used to indicate that the stream should be sent with no latency.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Available Enums/VideoQuality.xml": "<page>\n <h1>VideoQuality</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"enum\">pytgcalls.types.<sb>VideoQuality</sb></ref>\n </category-title>\n <subtext>\n <text>Enumeration of video quality settings for video streams in telegram calls.</text>\n <br/>\n <pg-title>ENUMERATION MEMBERS</pg-title>\n <subtext>\n <category-title><ref><sb>UHD_4K</sb></ref> <shi>=</shi> (3840, 2160, 60)</category-title>\n <subtext><text>Represents ultra-high-definition 4K video with a resolution of 3840x2160 and 60 FPS.</text></subtext>\n\n <category-title><ref><sb>QHD_2K</sb></ref> <shi>=</shi> (2560, 1440, 60)</category-title>\n <subtext><text>Represents quad high-definition 2K video with a resolution of 2560x1440 and 60 FPS.</text></subtext>\n\n <category-title><ref><sb>FHD_1080p</sb></ref> <shi>=</shi> (1920, 1080, 60)</category-title>\n <subtext><text>Represents full high-definition 1080p video with a resolution of 1920x1080 and 60 FPS.</text></subtext>\n\n <category-title><ref><sb>HD_720p</sb></ref> <shi>=</shi> (1280, 720, 30)</category-title>\n <subtext><text>Represents high-definition 720p video with a resolution of 1280x720 and 30 FPS.</text></subtext>\n\n <category-title><ref><sb>SD_480p</sb></ref> <shi>=</shi> (854, 480, 30)</category-title>\n <subtext><text>Represents standard-definition 480p video with a resolution of 854x480 and 30 FPS.</text></subtext>\n\n <category-title><ref><sb>SD_360p</sb></ref> <shi>=</shi> (640, 360, 30)</category-title>\n <subtext><text>Represents standard-definition 360p video with a resolution of 640x360 and 30 FPS.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Basic Methods/Idle.xml": "<page>\n <h1>Idle</h1>\n <text>\n This function will run indefinitely in order to block the main script\n execution and prevent it from exiting while having client(s) that are still running in the background.\n\n PyTgCalls works by keeping your handlers in a pool of worker threads, which run\n concurrently outside the main thread. Calling idle() will ensure that the client(s) remain active, by\n preventing the main script from ending until you decide to quit.\n\n Once a signal is received (e.g.: from CTRL+C) the function will terminate and your main script will continue.\n </text>\n <h3>Example</h3>\n <syntax-highlight mark=\"15\">\n from pytgcalls import Client\n from pytgcalls import idle\n ...\n\n app1 = PyTgCalls(client1)\n app2 = PyTgCalls(client2)\n app3 = PyTgCalls(client3)\n\n ... # Set handlers up\n\n app1.start()\n app2.start()\n app3.start()\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">pytgcalls.<sb>idle</sb></ref>()\n </category-title>\n <subtext>\n <text>Blocks the main script execution until a signal is received.</text>\n </subtext>\n</page>","/PyTgCalls/Basic Methods/Leave Call.xml": "<page>\n <h1>Leave Call</h1>\n <alert type=\"warning\">\n <text>This method replaces the deprecated <code>leave_group_call</code> method.</text>\n </alert>\n <text>This method allows leaving and stopping a group call or a private call, or declining a private call.</text>\n <h3>Example</h3>\n <syntax-highlight mark=\"10-12\">\n from pytgcalls import Client\n from pytgcalls import idle\n ...\n\n app = PyTgCalls(client)\n app.start()\n\n ... # Call API methods\n\n app.leave_call(\n -1001185324811,\n )\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>leave_call</sb></ref>()\n </category-title>\n <subtext>\n <text>Leave a group call or a private call.</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"CONNECTION_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Basic Methods/Play.xml": "<page>\n <p2p-banner/>\n <h1>Play</h1>\n <alert type=\"warning\">\n <text>This method replaces the deprecated <code>join_group_call</code> and <code>change_stream</code> methods.</text>\n </alert>\n <text>This method allows streaming audio or video to a group call or a private call.</text>\n <h3>Example</h3>\n <syntax-highlight mark=\"11-16\">\n from pytgcalls import Client\n from pytgcalls import idle\n from pytgcalls.types import MediaStream\n ...\n\n app = PyTgCalls(client)\n app.start()\n\n ... # Call API methods\n\n app.play(\n -1001185324811,\n MediaStream(\n 'test.mp4',\n )\n )\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>play</sb></ref>()\n </category-title>\n <subtext>\n <text>Join in a group call or accept/request a private call to stream audio or video.</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n <config id=\"ARG_INPUT_STREAM\"/>\n <category-title><ref>config</ref>: Optional[Union[<docs-ref link=\"/PyTgCalls/Advanced Types/CallConfig\">pytgcalls.types.CallConfig</docs-ref>, <docs-ref link=\"/PyTgCalls/Advanced Types/GroupCallConfig\">pytgcalls.types.GroupCallConfig</docs-ref>]]</category-title>\n <subtext><text>Additional configuration for the call.</text></subtext>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"BASE_MTPROTO\"/>\n <config id=\"GROUP_CALL_EXCEPTIONS\"/>\n <config id=\"STREAM_EXCEPTIONS\"/>\n <category-title>exception <ref>pytgcalls.exceptions.<sb>CallDeclined</sb></ref></category-title>\n <subtext><text>The call was declined by the user.</text></subtext>\n <category-title>exception <ref>pytgcalls.exceptions.<sb>CallDiscarded</sb></ref></category-title>\n <subtext><text>The call was discarded by the user while connecting.</text></subtext>\n <config id=\"TELEGRAM_EXCEPTION\"/>\n <category-title>exception <ref>pytgcalls.exceptions.<sb>AlreadyJoinedError</sb></ref></category-title>\n <subtext><text>You are attempting to join in a call you're already a part of.</text></subtext>\n <config id=\"RTMP_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Basic Methods/Run.xml": "<page>\n <h1>Run</h1>\n <text>\n This is a convenience method that calls <docs-ref link=\"/PyTgCalls/Basic Methods/Start\">start()</docs-ref>, <docs-ref link=\"/PyTgCalls/Basic Methods/Idle\">idle()</docs-ref> in sequence.\n It makes running a client less verbose, but it is not suitable in case you want to run more than one client in a single script,\n since the <docs-ref link=\"/PyTgCalls/Basic Methods/Idle\">idle()</docs-ref> part will block all the subsequent code after starting the client.\n </text>\n <h3>Example</h3>\n <syntax-highlight mark=\"8\">\n from pytgcalls import Client\n from pytgcalls import idle\n ...\n app = Client(client)\n\n ... # Call API decorators / MtProto decorators\n\n app.run()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>run</sb></ref>()\n </category-title>\n <subtext>\n <text>Start the client, idle the main script and finally stop the client.</text>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"RUNNING_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Basic Methods/Start.xml": "<page>\n <h1>Start</h1>\n <text>\n This method start and then initialize NTgCalls core.\n </text>\n <h3>Example</h3>\n <syntax-highlight mark=\"8\">\n from pytgcalls import Client\n from pytgcalls import idle\n ...\n app = Client(client)\n\n ... # Call API decorators / MTProto decorators\n\n app.start()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>start</sb></ref>()\n </category-title>\n <subtext>\n <text>Start the client.</text>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"RUNNING_EXCEPTION\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Calling Methods.xml": "<page>\n <h1>Calling Methods</h1>\n <text>\n At this point, we have successfully <docs-ref link=\"/PyTgCalls/Install Guide\">installed PyTgCalls</docs-ref> and installed an MTProto client;\n we are now aiming towards the core of the library. It\u2019s time to start playing with the API!\n </text>\n <h2>Basic Usage</h2>\n <text>Making API method calls with PyTgCalls is very simple. Here\u2019s a basic example we are going to examine step by step:</text>\n <syntax-highlight>\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n from pytgcalls.types import MediaStream\n ...\n api_id = 12345\n api_hash = '0123456789abcdef0123456789abcdef'\n ...\n app = PyTgCalls(client)\n app.start()\n app.play(\n -1001185324811,\n MediaStream(\n 'http://docs.evostream.com/sample_content/assets/sintel1m720p.mp4',\n )\n )\n idle()\n </syntax-highlight>\n <h3>Basic step-by-step</h3>\n <list style=\"numbers\">\n <item syntax-highlight=\"from pytgcalls import PyTgCalls\n from pytgcalls import idle\n from pytgcalls.types import MediaStream\">\n Let\u2019s begin by importing the Client class, Stream type and idle function:\n </item>\n <item>\n Now let\u2019s import your MTProto Client:\n <multisyntax id=\"mtproto\">\n <tabs>\n <tab id=\"pyrogram\">PyrogramMod</tab>\n <tab id=\"telethon\">Telethon</tab>\n <tab id=\"hydrogram\">Hydrogram</tab>\n </tabs>\n <syntax-highlight id=\"pyrogram\">\n from pyrogram import Client\n </syntax-highlight>\n <syntax-highlight id=\"telethon\">\n from telethon import TelegramClient\n </syntax-highlight>\n <syntax-highlight id=\"hydrogram\">\n from hydrogram import Client\n </syntax-highlight>\n </multisyntax>\n </item>\n <item>\n Set your api_id and api_hash taken from <a href=\"https://my.telegram.org/apps\">my.telegram.org</a>:\n <syntax-highlight>\n api_id = 12345\n api_hash = '0123456789abcdef0123456789abcdef'\n </syntax-highlight>\n </item>\n <item>\n Initialize the MTProto client:\n <multisyntax id=\"mtproto\">\n <tabs>\n <tab id=\"pyrogram\">PyrogramMod</tab>\n <tab id=\"telethon\">Telethon</tab>\n <tab id=\"hydrogram\">Hydrogram</tab>\n </tabs>\n <syntax-highlight id=\"pyrogram\">\n client = Client('test_session', api_id, api_hash)\n </syntax-highlight>\n <syntax-highlight id=\"telethon\">\n client = TelegramClient('test_session', api_id, api_hash)\n </syntax-highlight>\n <syntax-highlight id=\"hydrogram\">\n client = Client('test_session', api_id, api_hash)\n </syntax-highlight>\n </multisyntax>\n </item>\n <item>\n Initialize the PyTgCalls client:\n <syntax-highlight>\n app = PyTgCalls(client)\n </syntax-highlight>\n </item>\n <item>\n Start the PyTgCalls client:\n <syntax-highlight>\n app.start()\n </syntax-highlight>\n </item>\n <item>\n Now you can call any method you want:\n <syntax-highlight>\n app.play(\n -1001185324811,\n MediaStream(\n 'http://docs.evostream.com/sample_content/assets/sintel1m720p.mp4',\n )\n )\n </syntax-highlight>\n </item>\n <item>\n Lastly, call the idle function to keep your code running:\n <syntax-highlight>\n idle()\n </syntax-highlight>\n </item>\n </list>\n <h2>Asynchronous Calls</h2>\n <text>In case you wish to run PyTgCalls asynchronously:</text>\n <syntax-highlight>\n import asyncio\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n from pytgcalls.types import MediaStream\n ...\n app = PyTgCalls(client)\n\n async def main():\n await app.start()\n await app.play(\n -1001185324811,\n MediaStream(\n 'http://docs.evostream.com/sample_content/assets/sintel1m720p.mp4',\n )\n )\n await idle()\n\n asyncio.get_event_loop().run_until_complete(main())\n </syntax-highlight>\n <h3>Asynchronous step-by-step</h3>\n <list style=\"numbers\">\n <item>\n Import PyTgCalls, AsyncIO and create an instance:\n <syntax-highlight>\n import asyncio\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n ...\n app = PyTgCalls(client)\n </syntax-highlight>\n </item>\n <item>\n Async methods can\u2019t be executed at the top level, because they must be within an async-defined function;\n here, we define one, and we put our code inside it; method calls require the await keyword:\n <syntax-highlight>\n async def main():\n await app.start()\n await app.play(\n -1001185324811,\n MediaStream(\n 'http://docs.evostream.com/sample_content/assets/sintel1m720p.mp4',\n )\n )\n await idle()\n </syntax-highlight>\n </item>\n <item>\n Then, we tell asyncio to call <code>main()</code> in async mode\n <syntax-highlight>asyncio.get_event_loop().run_until_complete(main())</syntax-highlight>\n </item>\n </list>\n</page>","/PyTgCalls/Changelogs.xml": "<page>\n <h1>Changelogs</h1>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgSep24.png\"\n minititle=\"MINOR UPDATE\"\n bigtitle=\"PyTgCalls v2.0.3\"\n description=\"Private Calls Stable, Performances Improvements and more!\"\n mainbg=\"#070d16\"\n version=\"2.0.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">What's new?</h3>\n <list>\n <item><text><b>Private Calls are Now Stable:</b> Easily make private calls, even for groups, with a single method\u2014just use <docs-ref link=\"/PyTgCalls/Basic Methods/Play\">play()</docs-ref>! Check out the example here: <a href=\"https://github.com/pytgcalls/pytgcalls/blob/master/example/p2p_example/example_p2p.py\">Private Calls</a>.</text></item>\n <item><text><b>Performance Boost:</b> We're now running the latest WebRTC version (<a href=\"https://chromiumdash.appspot.com/branches\">m128</a>), bringing key performance fixes. Plus, with the latest pybind11 update, issues with Python's garbage collection have been resolved for a smoother experience.</text></item>\n <item><text><b>New \"adjust_by_height\" Feature:</b> Adjust video resolution by height instead of width, giving you more flexibility in how you manage your video streams. Learn more <docs-ref link=\"/PyTgCalls/Stream Descriptors/VideoParameters\">here</docs-ref>.</text></item>\n <item><text><b>New Event Handlers (remove_handler & add_handler):</b> These methods allow you to register listeners for existing events just like the decorators in the library. Use them to handle events such as \"stream ended\" or \"new user connected\" within PyTgCalls. Find out more <docs-ref link=\"/PyTgCalls/Using Handlers\">here</docs-ref>.</text></item>\n <item><text><b>Improved Documentation:</b> Enjoy clearer, more detailed documentation with fresh examples, a new UI, a powerful search engine, and step-by-step guidance to help you get started quickly.</text></item>\n <config id=\"BUG_FIX_CHANGELOGS\"/>\n </list>\n <h3 noref=\"true\">Community Milestone</h3>\n <text>\n <b>Thank You All:</b> We've reached a new milestone with over 400 thousand of active monthly users! We're grateful for your support and feedback, which has helped us improve PyTgCalls and make it the go-to library for all your real-time communication needs.\n </text>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgApr24.png\"\n minititle=\"MAJOR UPDATE\"\n bigtitle=\"PyTgCalls v2.0.X\"\n description=\"Private Calls, Code Rework, Async Support and more!\"\n mainbg=\"#070d16\"\n version=\"2.0.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">What's new?</h3>\n <list>\n <item><text><b>Private Calls:</b> Now you can make private calls by just using a single method for also group calls, by using <docs-ref link=\"/PyTgCalls/Basic Methods/Play\">play()</docs-ref>.</text></item>\n <item><text><b>Code Rework:</b> The code has been reworked to improve performance, stability and to make it more readable.</text></item>\n <item><text><b>Async Support:</b> NTgCalls now supports asynchronous methods for improved performance.</text></item>\n <item><text><b>Filters for Updates:</b> Added filters for updates to allow for more granular control over updates, <docs-ref link=\"/PyTgCalls/Filters\">More Info</docs-ref>.</text></item>\n <item><text><b>Improved Documentation:</b> Updated documentation with more examples, new UI and comprehensive guidance.</text></item>\n <config id=\"BUG_FIX_CHANGELOGS\"/>\n </list>\n <h3 noref=\"true\">Breaking Changes</h3>\n <list>\n <item>\n <text>Now methods like <code>change_stream()</code> and <code>join_group_call()</code> was removed, now you can use <code>play()</code> for both private, group calls and changing streams.</text>\n <multisyntax as-blame=\"true\">\n <syntax-highlight>\n # Change stream\n call_py.change_stream(\n -1001234567890,\n AudioPiped(\n 'input.mp4',\n ),\n )\n <br/>\n # Join group call\n call_py.join_group_call(\n -1001234567890,\n AudioPiped(\n 'input.mp4',\n ),\n )\n </syntax-highlight>\n <syntax-highlight>\n # Change stream\n call_py.play(\n -1001234567890,\n AudioPiped(\n 'input.mp4',\n ),\n )\n <br/>\n # Join group call\n call_py.play(\n -1001234567890,\n AudioPiped(\n 'input.mp4',\n ),\n )\n </syntax-highlight>\n </multisyntax>\n </item>\n <item>\n <text>Now all listeners like <code>on_stream_end()</code> was unified in <code>on_update()</code> and with <docs-ref link=\"/PyTgCalls/Filters\">filters</docs-ref>, for example:</text>\n <multisyntax as-blame=\"true\">\n <syntax-highlight>\n # On Closed Voice Chat\n @call_py.on_closed_voice_chat()\n async def on_closed_voice_chat(client: PyTgCalls, update: Update):\n print(update)\n <br/>\n # On stream end\n @call_py.on_stream_end()\n async def on_stream_end(client: PyTgCalls, update: Update):\n print(update)\n </syntax-highlight>\n <syntax-highlight>\n from pytgcalls import filters\n from pytgcalls.types import ChatUpdate\n ...\n # On Closed Voice Chat\n @call_py.on_update(filters.chat_update(ChatUpdate.Status.CLOSED_VOICE_CHAT))\n async def on_closed_voice_chat(client: PyTgCalls, update: Update):\n print(update)\n <br/>\n # On stream end\n @call_py.on_update(filters.stream_end)\n async def on_stream_end(client: PyTgCalls, update: Update):\n print(update)\n </syntax-highlight>\n </multisyntax>\n </item>\n <item>\n <text>Reworked <code>GroupCall</code> type, now is <docs-ref link=\"/PyTgCalls/Advanced Types/Call\">Call</docs-ref> and now is more powerful and easy to use.</text>\n </item>\n <item>\n <text>Removed <code>JoinedGroupCallParticipant</code> and <code>LeftGroupCallParticipant</code> classes, now you can see the action in <docs-ref link=\"/PyTgCalls/Advanced Types/GroupCallParticipant\">GroupCallParticipant</docs-ref> class.</text>\n </item>\n <item>\n <text>Removed all legacy types and input stream, now is a mandatory to use <docs-ref link=\"/PyTgCalls/Stream Descriptors/MediaStream\">MediaStream</docs-ref> for all streams.</text>\n </item>\n <item>\n <text>Now <code>ping()</code> from <docs-ref link=\"/PyTgCalls/Client\">Client</docs-ref> is not anymore a coroutine, now is a normal method.</text>\n </item>\n <item>\n <text>Removed <code>get_active_call()</code> and <code>get_call()</code>, now is a mandatory to use <code>calls()</code> from <docs-ref link=\"/PyTgCalls/Client\">Client</docs-ref>.</text>\n </item>\n <item>\n <text>Renamed <code>leave_group_call</code> to <docs-ref link=\"/PyTgCalls/Basic Methods/Leave Call\">leave_call()</docs-ref>.</text>\n </item>\n <item>\n <text>Moved <code>MediaStream</code> flags under <docs-ref link=\"/PyTgCalls/Available Enums/MediaStream Flags\">MediaStream.Flags</docs-ref> instead of <code>MediaStream</code>.</text>\n </item>\n <item>\n <text>Now <code>invite_hash</code>, <code>join_as</code> and <code>auto_start</code> are part of <docs-ref link=\"/PyTgCalls/Advanced Types/GroupCallConfig\">GroupCallConfig</docs-ref> instead of <code>join_group_call</code>.</text>\n </item>\n <item>\n <text>Renamed <code>additional_ffmpeg_parameters</code> to <code>ffmpeg_parameters</code> in <docs-ref link=\"/PyTgCalls/Stream Descriptors/MediaStream\">MediaStream</docs-ref>.</text>\n </item>\n <item>\n <text>For more info about breaking changes, check the <docs-ref link=\"/PyTgCalls/Examples\">Examples</docs-ref>, if we missed something, please <a href=\"https://github.com/pytgcalls/docsdata/issues/new\">open an issue</a>.</text>\n </item>\n </list>\n <h3 noref=\"true\">Additional Notes</h3>\n <text>\n We're pleased to announce that now is available an unofficial porting of NTgCalls for Rust, for more info, check the <a href=\"https://github.com/YouKnow-sys/ntgcalls-rs\">repository</a>.\n </text>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgFeb24.png\"\n minititle=\"MAJOR UPDATE\"\n bigtitle=\"PyTgCalls v1.2.X\"\n description=\"Static Typing, YtDlp support and More\"\n mainbg=\"#070d16\"\n version=\"1.2.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">What's new?</h3>\n <list>\n <item><text><b>Static Typing:</b> PyTgCalls is now fully statically typed, ensuring that the types of each method and class are thoroughly checked.</text></item>\n <item><text><b>YtDlp Support:</b> MediaStream now supports links from YouTube using YtDlp, for example: <a href=\"https://www.youtube.com/watch?v=dQw4w9WgXcQ\">https://www.youtube.com/watch?v=iSbLHrrqmoM</a></text></item>\n <item>\n <text><b>MediaStream Quality Support:</b> MediaStream now accepts enhanced quality options for audio and video parameters. For audio, use <docs-ref link=\"/PyTgCalls/Available Enums/AudioQuality\">pytgcalls.types.AudioQuality</docs-ref>, and for video, use <docs-ref link=\"/PyTgCalls/Available Enums/VideoQuality\">pytgcalls.types.VideoQuality</docs-ref>.</text>\n <multisyntax as-blame=\"true\">\n <syntax-highlight>\n call_py.join_group_call(\n -1001234567890,\n MediaStream(\n 'input.mp4',\n AudioParameters.from_quality(AudioQuality.STUDIO),\n VideoParameters.from_quality(VideoQuality.FHD_1080p),\n ),\n )\n </syntax-highlight>\n <syntax-highlight>\n call_py.join_group_call(\n -1001234567890,\n MediaStream(\n 'input.mp4',\n AudioQuality.STUDIO,\n VideoQuality.FHD_1080p,\n ),\n )\n </syntax-highlight>\n </multisyntax>\n </item>\n <config id=\"BUG_FIX_CHANGELOGS\"/>\n </list>\n <h3 noref=\"true\">Breaking Changes</h3>\n <list>\n <item><text>Now all raw methods like AudioParameters, VideoParameters, AudioStream, VideoStream, and Stream are all under <code>pytgcalls.types.raw</code> instead of <code>pytgcalls.types</code>.</text></item>\n <item><text>The exception class <code>pytgcalls.exceptions.TelegramServerError</code> is now part of <code>ntgcalls.TelegramServerError</code>.</text></item>\n </list>\n <h3 noref=\"true\">Additional Notes</h3>\n <text>\n We're pleased to announce that pre-compiled wheels optimized for ARM64 devices are now available.\n </text>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgCon24.png\"\n minititle=\"NEWS\"\n bigtitle=\"#PyTgCon2K24\"\n description=\"If you've crafted a public open repository, it's time to showcase your work in the PyTgCalls Contest! \ud83c\udf1f\"\n mainbg=\"#070d16\"\n version=\"1.1.6\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n presentationtitle=\"PyTgCalls Contest\"\n presentationdescription=\"Competition for bot developers\"\n presentationbuttontitle=\"Participate\"\n presentationbuttonurl=\"https://github.com/pytgcalls/pytgcalls/discussions/199\"\n presentationimage=\"/src/assets/contest.png\"\n />\n <subtext>\n <h3 noref=\"true\">Here's how to join:</h3>\n <list>\n <item><text><b>Visit the discussion page:</b> <a href=\"https://github.com/pytgcalls/pytgcalls/discussions/199\">PyTgCalls Contest</a></text></item>\n <item><text><b> Share these details:</b> Your Repository Name, Brief Description of Your Bot, Link to Your Repository</text></item>\n </list>\n <h3 noref=\"true\">Prizes and Recognition</h3>\n <list>\n <item><text>Encourage upvotes by reposting this message in your channels.</text></item>\n <item><text>The bot with the highest upvotes earns a prestigious place in the PyTgCalls documentation.</text></item>\n </list>\n <h3 noref=\"true\">Contest Rules</h3>\n <list>\n <item><text>Make sure your repository goes beyond minor tweaks of a fork.</text></item>\n <item><text>Use the <a href=\"https://pypi.org/project/py-tgcalls/1.1.2/\">latest</a> PyTgCalls version).</text></item>\n <item><text>Your repository should be public.</text></item>\n </list>\n <text>Join the contest now and showcase your PyTgCalls-powered bot for a chance to be featured prominently on the PyTgCalls documentation! Good luck!</text>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgDec23v2.png\"\n minititle=\"MINOR UPDATE\"\n bigtitle=\"PyTgCalls v1.1.X\"\n description=\"Unified Stream Design, AutoStart GroupCalls and More\"\n mainbg=\"#070d16\"\n version=\"1.1.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">What's new?</h3>\n <list>\n <item><text><b>AutoStart of Group Calls:</b> Now GroupCalls will be started automatically if they are not started, if you want to know how to disable it, <docs-ref link=\"/PyTgCalls/Basic Methods/Play#Details\">read here</docs-ref>.</text></item>\n <item>\n <text><b>Unified Stream Design:</b> Now you can do whatever you want, streaming audio, video, both, recording the stream etc. with just one class!.</text>\n <multisyntax as-blame=\"true\">\n <syntax-highlight>\n # Play audio and video from and MP4 file\n call_py.join_group_call(\n -1001234567890,\n AudioVideoPiped(\n 'input.mp4',\n ),\n )\n <br/>\n # Stream audio only from an MP4 file\n call_py.join_group_call(\n -1001234567890,\n AudioPiped(\n 'input.mp4',\n ),\n )\n <br/>\n # Stream screen\n call_py.join_group_call(\n -1001234567890,\n CaptureVideoDesktop(\n MediaDevices.get_screen_devices()[0],\n ),\n )\n </syntax-highlight>\n <syntax-highlight>\n # Play audio and video from and MP4 file\n call_py.join_group_call(\n -1001234567890,\n MediaStream(\n 'input.mp4',\n ),\n )\n <br/>\n # Stream audio only from an MP4 file\n call_py.join_group_call(\n -1001234567890,\n MediaStream(\n 'input.mp4',\n video_flags=MediaStream.IGNORE,\n ),\n )\n <br/>\n # Stream screen\n call_py.join_group_call(\n -1001234567890,\n MediaStream(\n MediaDevices.get_screen_devices()[0],\n ),\n )\n </syntax-highlight>\n </multisyntax>\n </item>\n <config id=\"BUG_FIX_CHANGELOGS\"/>\n </list>\n <h3 noref=\"true\">Deprecation Notice</h3>\n <text>\n As we said in the last post,\n now PyTgCalls <b>0.8.6</b> has reached the <b>end of life</b>,\n so this update is completely incompatible with this or previous versions.\n We have also deprecated most of the Stream Piped methods, here's the list:\n </text>\n <list>\n <item><text>AudioImagePiped</text></item>\n <item><text>AudioPiped</text></item>\n <item><text>AudioVideoPiped</text></item>\n <item><text>CaptureAudioDevice</text></item>\n <item><text>CaptureAVDesktop</text></item>\n <item><text>CaptureAVDeviceDesktop</text></item>\n <item><text>CaptureVideoDesktop</text></item>\n <item><text>VideoPiped</text></item>\n </list>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgDec23.png\"\n minititle=\"MAJOR UPDATE\"\n bigtitle=\"PyTgCalls v1.0.X\"\n description=\"NTgCalls, Hydrogram Support, New Documentation, and More\"\n mainbg=\"#070d16\"\n version=\"1.0.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">What's new?</h3>\n <list>\n <item><text><b>NTgCalls Integration:</b> The PyTgCalls core has been updated to use NTgCalls instead of TgCallsJS, making it more portable and eliminating overhead. Now, you only need to install ffmpeg on your machine, resulting in improved performance.</text></item>\n <item><text><b>Hydrogram Support:</b> Official support for Hydrogram, a new mtproto client based on Pyrogram, providing new possibilities and enhancing the overall experience.</text></item>\n <item><text><b>New Documentation:</b> Revamped documentation with improved clarity, comprehensive examples, and up-to-date guidance for developers.</text></item>\n <config id=\"BUG_FIX_CHANGELOGS\"/>\n </list>\n <h3 noref=\"true\">Community Milestone</h3>\n <text>\n <b>Thank You All:</b> Celebrating over 100 thousand Downloads! The project has seen remarkable growth, averaging around 8,000 downloads per week since its launch. We appreciate the community's strong interest and support.\n </text>\n <h3 noref=\"true\">Deprecation Notice</h3>\n <text>\n <b>End-of-Life (EOL) Dates:</b> Due to changes in Pyrogram and significant time since the release of PyTgCalls 0.8.X, different versions are marked for end-of-life:\n </text>\n <list>\n <item><text><b>0.8.0, 0.8.1, 0.8.2, 0.8.3, 0.8.4, 0.8.5:</b> Support ended due to outdated versions.</text></item>\n <item><text><b>0.8.6:</b> Support will continue until December 18 due to Pyrogram archiving.</text></item>\n <item><text><b>0.9.X:</b> Current Long-Term Support.</text></item>\n <item><text><b>1.0.X:</b> Latest version with high-support rate.</text></item>\n </list>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgSep22.png\"\n minititle=\"BUG FIXES\"\n bigtitle=\"PyTgCalls v0.9.X\"\n description=\"Feature Enhancements and Bug Fixes\"\n mainbg=\"#070d16\"\n version=\"0.9.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">What's new?</h3>\n <list>\n <item><text><b>Time Tracking:</b> Added the ability to determine the time of the currently playing audio/video. For more details, check <docs-ref link=\"/PyTgCalls/Stream Methods/Played Time\">Played Time</docs-ref>.</text></item>\n <item><text><b>New Errors:</b> Introduced two new errors, UnMuteNeeded and RTMPStreamNeeded.</text></item>\n </list>\n <h3 noref=\"true\">Changes & Bug Fixes</h3>\n <list>\n <item><text><b>End of Life for Python3.6:</b> Support for Python 3.6 has reached the end of life and is no longer maintained.</text></item>\n <item><text><b>Security Fix:</b> Addressed a security issue with the ID generation process to enhance overall security.</text></item>\n <item><text><b>Multi-Thread Removal:</b> Removed Multi-Thread Py-TgCalls due to no bug fixes by Node.js for over 4 years.</text></item>\n </list>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgJul22.png\"\n minititle=\"NEWS\"\n bigtitle=\"Google Partnership!\"\n description=\"Py-TgCalls classified as one of most used projects on PyPI\"\n mainbg=\"#070d16\"\n version=\"0.9.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n presentationbuttontitle=\"Download\"\n />\n <subtext>\n <text>\n As we know, Google is in charge of financing Python.\n Due to the recent events with the <a href=\"https://gitprotect.io/blog/compromised-npm-packages-malware-and-github/\">Node.js situation</a>, PyPI ran for cover,\n thanks to the strong collaboration between Python and the Google Open Source Security Team they offered 4000 Titan Tokens for free available only in some regions of the world.\n PyPI to distribute these security tokens was based on a criterion, that is; any project in the top 1% of downloads in the previous 6 months is considered critical,\n at the moment only <b>3500 projects</b> are considered out of <b>350 thousand</b> are considered as such and py-tgcalls is considered a critical project.\n According to statistics last month, it was downloaded <b>684 thousand</b> times.\n </text>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgDec21.png\"\n minititle=\"BUG FIXES\"\n bigtitle=\"PyTgCalls v0.8.3\"\n description=\"WebRTC Retry Fixes and Asynchronous Method Invocation\"\n mainbg=\"#070d16\"\n version=\"0.8.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">Changes & Bug Fixes</h3>\n <list>\n <item><text><b>WebRTC Retry Fixes:</b> Addressed issues with WebRTC retry for more reliable connections.</text></item>\n <item><text><b>Asynchronous Method Invocation:</b> All methods, such as join_group_call, now use asyncio future, waiting for responses from Node.js asynchronously.</text></item>\n </list>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgNov21.png\"\n minititle=\"MAJOR UPDATE\"\n bigtitle=\"PyTgCalls v0.8.X\"\n description=\"Telethon Support, Group/Channel Join, Video Group Call, and More\"\n mainbg=\"#070d16\"\n version=\"0.8.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">What's new?</h3>\n <list>\n <item>\n <text><b>Internal FFmpeg Conversion:</b> Introduced internal FFmpeg conversion for AudioPiped, AudioVideoPiped, and AudioImagePiped for seamless multimedia handling.</text>\n <syntax-highlight mark=\"3-5\">\n call_py.join_group_call(\n -1001234567890,\n AudioVideoPiped(\n 'input.webm',\n ),\n stream_type=StreamType().pulse_stream,\n )\n </syntax-highlight>\n </item>\n <item><text><b>Remote Stream Support:</b> Added support for remote streams for more diverse streaming options.</text></item>\n <item><text><b>Stream Image with Audio:</b> Added the ability to stream images with audio using AudioImagePiped.</text></item>\n <item><text><b>GetParticipants and OnParticipantChange:</b> New functionalities for handling participants in group calls.</text></item>\n <item><text><b>Browser Constants as Headers:</b> Added browser constants as headers for FFmpeg.</text></item>\n <item><text><b>Python 3.10 Support:</b> Added compatibility with Python 3.10.</text></item>\n </list>\n <h3 noref=\"true\">Changes & Fixes</h3>\n <list>\n <item><text><b>Proportion Video Support:</b> Added support for all proportion video formats for a more versatile video experience.</text></item>\n <item><text><b>Communication Fix:</b> Addressed stderr overflow by adding a reader for improved Node.js communication.</text></item>\n <item><text><b>WebRTC Connection Retry:</b> Added automatic retry if WebRTC connection fails for more reliable connections.</text></item>\n <item><text><b>Lighter Buffer Reader:</b> Optimized the Buffer Reader for lighter resource usage.</text></item>\n <item><text><b>Multiple Ping Requests:</b> Now supports multiple ping requests for improved responsiveness.</text></item>\n </list>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgAug21v2.png\"\n minititle=\"MAJOR UPDATE\"\n bigtitle=\"PyTgCalls v0.7.X\"\n description=\"Code Cleanup, Full Asynchronous Support, and Enhanced Functionality\"\n mainbg=\"#070d16\"\n version=\"0.7.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">What's new?</h3>\n <list>\n <item><text><b>Custom Exceptions:</b> Added custom exceptions for more robust error handling.</text></item>\n <item><text><b>Platform Support:</b> Added support for Windows, macOS, and Linux Arm64.</text></item>\n </list>\n <h3 noref=\"true\">Changes & Fixes</h3>\n <list>\n <item><text><b>PyTgCalls Re-Base:</b> Code cleanup and fixes for a more streamlined and efficient codebase.</text></item>\n <item><text><b>Fully Async:</b> The library is now fully asynchronous for improved performance.</text></item>\n <item><text><b>Communication Update:</b> Removed the internal socket server for Node.js communication between Python, replaced with stdin and stdout.</text></item>\n <item><text><b>CustomAPI Renewed:</b> CustomAPI upgraded to version 2.1 with new features and improvements.</text></item>\n <item><text><b>RawUpdate Enhancement:</b> RawUpdate renewed with PyTgCalls Object Update for better handling of updates.</text></item>\n <item><text><b>Method Name Change:</b> .run() is now .start() and no longer blocks code execution.</text></item>\n <item><text><b>Logging Update:</b> Now logs are directed to Python Logging for improved logging capabilities.</text></item>\n <item><text><b>Voice Call Handling:</b> If the stream is deleted, the userbot will exit the voice call by printing an error in RawUpdate.</text></item>\n <config id=\"BUG_FIX_CHANGELOGS\"/>\n </list>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgAug21.png\"\n minititle=\"MINOR UPDATE\"\n bigtitle=\"PyTgCalls v0.6.X\"\n description=\"Multi-core Beta Support, Function Execution Without Node.js Core Waiting, and More\"\n mainbg=\"#070d16\"\n version=\"0.6.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">What's new?</h3>\n <list>\n <item><text><b>Multi-core support:</b> PyTgCalls now supports multiple cores for enhanced performance.</text></item>\n <item><text><b>Remote version check:</b> Added the ability to check for the latest version available on GitHub remotely.</text></item>\n </list>\n <h3 noref=\"true\">Changes & Fixes</h3>\n <list>\n <item><text><b>CustomAPI 2.0:</b> Upgraded to CustomAPI version 2.0 with new features and improvements.</text></item>\n <item><text><b>Security Fix:</b> Addressed a security vulnerability for a more secure experience.</text></item>\n <item><text><b>Function execution without Node.js Core waiting:</b> Users can now call functions without waiting for the Node.js Core.</text></item>\n </list>\n </subtext>\n <separator/>\n </category>\n <category>\n <br/>\n <banner\n imageurl=\"/src/assets/updates/PyTgJul21.png\"\n minititle=\"BUG FIXES\"\n bigtitle=\"PyTgCalls v0.5.X\"\n description=\"Smoother Installation, Active Calls Resolved, and Enhanced Error Insight\"\n mainbg=\"#070d16\"\n version=\"0.5.X\"\n imagewidth=\"1920\"\n imageheight=\"1080\"\n />\n <subtext>\n <h3 noref=\"true\">Changes & Fixes</h3>\n <list>\n <item><text><b>Fixed PyPi builds: </b>Fixed an issue where PyTgCalls compiled without the JavaScript core</text></item>\n <item><text><b>Improved join_group_call error: </b>The join_group_call error is now more descriptive</text></item>\n <config id=\"BUG_FIX_CHANGELOGS\"/>\n </list>\n </subtext>\n </category>\n</page>","/PyTgCalls/Client.xml": "<page>\n <h1>PyTgCalls Client</h1>\n <text>\n You now are in the API Reference section. Here you can find detailed information about PyTgCalls API:\n the main Client class, all available methods, types, attributes and decorators detailed descriptions can be found starting from this page.\n\n This page is about the Client class, which exposes high-level methods for easy access to the API.\n </text>\n <h3>Example</h3>\n <syntax-highlight mark=\"1-3\">\n from pytgcalls import PyTgCalls\n\n app = PyTgCalls(client)\n app.start()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.<sb>PyTgCalls</sb></ref>\n </category-title>\n <subtext>\n <text>PyTgCalls Client, the main tool for interacting with Telegram Calls.</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>app</ref>: Union[<a href=\"https://docs.pyrogram.org/api/client\">pyrogram.Client</a>, <a href=\"https://docs.telethon.dev/en/latest/modules/client.html\">telethon.TelegramClient</a>, <a href=\"https://hydrogram.amanoteam.com/en/latest/api/client.html\">hydrogram.Client</a>]</category-title>\n <subtext><text>Pass the MTProto Client</text></subtext>\n <category-title><ref>cache_duration</ref>: <shi>int</shi></category-title>\n <subtext><text>Cache duration of a Full Chat query</text></subtext>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>STATIC METHODS</pg-title>\n <subtext>\n <category-title><shi>async</shi> <ref><sb>calls</sb></ref> <shi>-> dict</shi>[<shi>str</shi>, <docs-ref link=\"/PyTgCalls/Advanced Types/Call\">Call</docs-ref>]</category-title>\n <config id=\"LIST_CALLS_DESC\"/>\n\n <category-title><shi>async</shi> <ref><sb>group_calls</sb></ref> <shi>-> dict</shi>[<shi>str</shi>, <docs-ref link=\"/PyTgCalls/Advanced Types/Call\">Call</docs-ref>]</category-title>\n <subtext><text>Get all group calls</text></subtext>\n\n <category-title><shi>async</shi> <ref><sb>private_calls</sb></ref> <shi>-> dict</shi>[<shi>str</shi>, <docs-ref link=\"/PyTgCalls/Advanced Types/Call\">Call</docs-ref>]</category-title>\n <subtext><text>Get all private calls</text></subtext>\n\n <category-title><ref><sb>cache_peer</sb></ref> <shi>-></shi> <config id=\"ARG_UNION_PEER\"/></category-title>\n <subtext><text>Get current Telegram user</text></subtext>\n\n <category-title><ref><sb>ping</sb></ref> <shi>-></shi> <shi>int</shi></category-title>\n <subtext><text>Ping of NTgCalls core</text></subtext>\n\n <category-title><shi>async</shi> <ref><sb>cpu_usage</sb></ref> <shi>-> float</shi></category-title>\n <subtext><text>Get the CPU usage of the current process</text></subtext>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <category-title>exception <ref>pytgcalls.exceptions.<sb>InvalidMTProtoClient</sb></ref></category-title>\n <subtext><text>You set an invalid MTProto client.</text></subtext>\n </subtext>\n </category>\n </subtext>\n\n </category>\n</page>","/PyTgCalls/Custom Api.xml": "<page>\n <h1>Custom API</h1>\n <text>\n You now are in the API Reference section where you can find detailed information about the Custom API:\n the Front-end API class, all available methods, types, attributes and decorators detailed descriptions can be found starting from this page.\n\n This page is about the CustomAPI class, which exposes high-level methods for easy access to the API.\n </text>\n <h3>Example</h3>\n <syntax-highlight mark=\"3-10\">\n from pytgcalls import CustomApi\n\n api = CustomApi()\n\n @api.on_update_custom_api()\n async def custom_api_request(request: dict):\n print(request)\n return {\n 'response': 'FOXES',\n }\n api.start()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.<sb>CustomApi</sb></ref>\n </category-title>\n <subtext>\n <text>CustomApi, the main means host the local http api server.</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>port</ref>: <shi>int</shi></category-title>\n <subtext><text>CustomApi port of the http server</text></subtext>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>METHODS</pg-title>\n <subtext>\n <category-title><ref><sb>start</sb></ref>()</category-title>\n <subtext><text>This method starts the internal http webserver, this is helpful if you need an API interface to PyTgCalls.</text></subtext>\n </subtext>\n </category>\n </subtext>\n </category>\n</page>","/PyTgCalls/Decorators.xml": "<page>\n <h1>Decorators</h1>\n <text>\n While still being methods bound to the <docs-ref link=\"/PyTgCalls/Client\">PyTgCalls</docs-ref> class,\n decorators hold a special significance that justifies a dedicated page.\n\n Decorators allow you to register callback functions for handling updates in a much easier and cleaner way.\n All you need to do is add the decorators on top of your functions.\n </text>\n <syntax-highlight mark=\"8-9\">\n from pytgcalls import PyTgCalls\n from pytgcalls.types import Update\n from pytgcalls import filters as call_filters\n ...\n client = # Here Your MTProto Client\n app = PyTgCalls(client)\n\n @app.on_update(call_filters.stream_end)\n async def handler(client: PyTgCalls, update: Update):\n print(update)\n\n app.run()\n </syntax-highlight>\n <separator/>\n <h1>PyTgCalls Decorators</h1>\n <br/>\n <category>\n <category-title><ref>@PyTgCalls.<sb>on_update</sb></ref>()</category-title>\n <subtext>\n <text>\n Decorator for handling all incoming updates.\n When any update is received, this decorator will be triggered.\n </text>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>filters</ref>: Optional[<docs-ref link=\"/PyTgCalls/Filters\">Filters</docs-ref>]</category-title>\n </subtext>\n <h3>Example</h3>\n <syntax-highlight mark=\"5-6\">\n from pytgcalls.types import Update\n ...\n app = PyTgCalls(client)\n ...\n @app.on_update()\n async def handler(client: PyTgCalls, update: Update):\n print(chat_id)\n ...\n app.run()\n </syntax-highlight>\n </subtext>\n </category>\n <br/>\n <h1>CustomApi Decorators</h1>\n <category-title><ref>@CustomApi.<sb>on_update_custom_api</sb></ref>()</category-title>\n <subtext>\n <text>Decorator for handling incoming HTTP events.</text>\n <pg-title>RAISES</pg-title>\n <subtext>\n <category-title>exception <ref>pytgcalls.exceptions.<sb>TooManyCustomApiDecorators</sb></ref></category-title>\n <subtext><text>You have set too many decorators.</text></subtext>\n </subtext>\n <h3>Example</h3>\n <syntax-highlight mark=\"4-10\">\n ...\n webserver = CustomApi(client)\n ...\n @webserver.on_update_custom_api()\n async def handler(request: dict):\n print(update)\n ... # Add Your Code here, switch or etc.\n return {\n 'result': 'OK',\n }\n webserver.start()\n idle()\n </syntax-highlight>\n </subtext>\n</page>","/PyTgCalls/Examples.xml": "<page>\n <h1>Examples</h1>\n <text>\n This page contains example scripts to demonstrate how PyTgCalls looks like.\n\n Every script is working right away (assuming you correctly set up your credentials), meaning you can simply copy-paste them\n and run. The only things you have to modify are session names and target chats, where applicable.\n\n The examples listed below can be treated as building blocks for your own applications and are designed to be simple enough\n to give you a basic idea.\n </text>\n <separator/>\n <table>\n <definitions>\n <column>Example</column>\n <column>Description</column>\n </definitions>\n <item>\n <column><ref-shi url=\"example/additional_ffmpeg_parameters/additional_ffmpeg_parameters.py\">additional_ffmpeg_parameters</ref-shi></column>\n <column>Append parameters to ffmpeg</column>\n </item>\n <item>\n <column><ref-shi url=\"example/capture_mic/example_mic.py\">capture_mic</ref-shi></column>\n <column>Capture microphone</column>\n </item>\n <item>\n <column><ref-shi url=\"example/custom_api/example_api.py\">custom_api</ref-shi></column>\n <column>Use custom API server to bind PHP or other API to PyTgCalls</column>\n </item>\n <item>\n <column><ref-shi url=\"example/fifo_conversion/example_fifo.py\">fifo_conversion</ref-shi></column>\n <column>Play a stream from fifo</column>\n </item>\n <item>\n <column><ref-shi url=\"example/p2p_example/example_p2p.py\">p2p_example</ref-shi></column>\n <column>Play a stream from a private call using PyTgCalls</column>\n </item>\n <item>\n <column><ref-shi url=\"example/piped_audio_calls/example_piped_audio.py\">piped_audio_calls</ref-shi></column>\n <column>Play audio using ffmpeg for live conversion (with integrated ffmpeg)</column>\n </item>\n <item>\n <column><ref-shi url=\"example/piped_image_calls/example_piped_image.py\">piped_image_calls</ref-shi></column>\n <column>Play audio and image using ffmpeg for live conversion (with integrated ffmpeg)</column>\n </item>\n <item>\n <column><ref-shi url=\"example/raw_streaming/example_video.py\">raw_streaming</ref-shi></column>\n <column>Play PCM16L and RAW_VIDEO from disk</column>\n </item>\n <item>\n <column><ref-shi url=\"example/remote_piped_play/example_remote_piped.py\">remote_piped_play</ref-shi></column>\n <column>Play a stream from a remote link using ffmpeg for live conversion (with integrated ffmpeg)</column>\n </item>\n <item>\n <column><ref-shi url=\"example/remote_stream_with_header/remote_stream_with_header.py\">remote_stream_with_header</ref-shi></column>\n <column>Play a stream from a remote link using ffmpeg for live conversion (with integrated ffmpeg) with additional headers</column>\n </item>\n <item>\n <column><ref-shi url=\"example/screen_sharing/example_desktop.py\">screen_sharing</ref-shi></column>\n <column>Screen sharing</column>\n </item>\n <item>\n <column><ref-shi url=\"example/screen_sharing_mic/example_desktop_mic.py\">screen_sharing_mic</ref-shi></column>\n <column>Screen sharing with microphone</column>\n </item>\n <item>\n <column><ref-shi url=\"example/simple_calls/example_simple.py\">simple_calls</ref-shi></column>\n <column>A simple example about using PyTgCalls with High Level Methods</column>\n </item>\n <item>\n <column><ref-shi url=\"example/telethon_example/example_telethon.py\">telethon_example</ref-shi></column>\n <column>A simple example about using PyTgCalls with Telethon</column>\n </item>\n <item>\n <column><ref-shi url=\"example/video_calls/example_piped_video.py\">video_calls</ref-shi></column>\n <column>Play audio and video using ffmpeg for live conversion (with integrated ffmpeg)</column>\n </item>\n <item>\n <column><ref-shi url=\"example/youtube_dl/youtube_dl_example.py\">youtube_dl</ref-shi></column>\n <column>Example usage of PyTgCalls with YoutubeDL</column>\n </item>\n </table>\n</page>","/PyTgCalls/Filters.xml": "<page>\n <h1>Filters</h1>\n <text>\n Filters are objects that can be used to filter the content of incoming updates.\n <docs-ref link=\"/PyTgCalls/Using Filters\">Read more about how filters work.</docs-ref>\n </text>\n <h2>Details</h2>\n <category>\n <category-title><ref>pytgcalls.filters.<sb src=\"method\">create</sb></ref>()</category-title>\n <subtext>\n <text>\n Easily create a custom filter.\n\n Custom filters give you extra control over which updates are allowed or not to be processed by your handlers.\n </text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>func</ref>: <shi>callable</shi></category-title>\n <subtext>\n <text>\n A function that accepts three positional arguments (filter, client, update) and returns a boolean: True if the update\n should be handled, False otherwise. The filter argument refers to the filter itself and can be used to access keyword\n arguments (read below). The client argument refers to the Client that received the update. The update argument type will\n vary depending on which <docs-ref link=\"/PyTgCalls/Decorators\">Handler</docs-ref> is coming from. Your function body can then access the incoming update attributes and decide\n whether to allow it or not.\n </text>\n </subtext>\n <category-title><ref>name</ref>: Optional[<shi>str</shi>]</category-title>\n <subtext>\n <text>\n Your filter\u2019s name. Can be anything you like. Defaults to \"CustomFilter\".\n </text>\n </subtext>\n <category-title><ref>**kwargs</ref>: Optional[Any]</category-title>\n <subtext>\n <text>\n Any additional keyword arguments you want to pass to your filter function.\n </text>\n </subtext>\n </subtext>\n </subtext>\n <br/>\n <category-title><ref>pytgcalls.filters.<sb src=\"method\">me</sb></ref>()</category-title>\n <subtext>\n <text>\n Filter updates for yourself.\n </text>\n </subtext>\n <br/>\n <category-title><ref>pytgcalls.filters.<sb src=\"method\">stream_end</sb></ref>()</category-title>\n <subtext>\n <text>\n Filter updates for when a stream ends.\n </text>\n </subtext>\n <br/>\n <category-title><ref>pytgcalls.filters.<sb src=\"method\">chat</sb></ref>()</category-title>\n <subtext>\n <text>\n Filter updates coming from one or more chats.\n You can use <a href=\"https://docs.python.org/3/library/stdtypes.html#set\">set bound methods</a> to manipulate the chats container.\n </text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>chats</ref>: Union[<shi>int</shi>, <shi>str</shi>, <shi>list</shi>]</category-title>\n <subtext>\n <text>\n Pass one or more chat ids/usernames to filter chats. Defaults to None (no chats).\n </text>\n </subtext>\n </subtext>\n </subtext>\n <br/>\n <category-title><ref>pytgcalls.filters.<sb src=\"method\">chat_update</sb></ref>()</category-title>\n <subtext>\n <text>\n Filter specific type of chat updates.\n </text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>flags</ref>: <docs-ref link=\"/PyTgCalls/Available Enums/ChatUpdate Status\">ChatUpdate.Status</docs-ref></category-title>\n <subtext>\n <text>\n Pass one or more flags to filter chat updates.\n </text>\n </subtext>\n </subtext>\n </subtext>\n <category-title><ref>pytgcalls.filters.<sb src=\"method\">call_participant</sb></ref>()</category-title>\n <subtext>\n <text>\n Filter updates for when a call participant joins, leaves or is updated.\n </text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>flags</ref>: Optional[<docs-ref link=\"/PyTgCalls/Available Enums/GroupCallParticipant Action\">GroupCallParticipant.Action</docs-ref>]</category-title>\n <subtext>\n <text>\n Pass one or more flags to filter call participant updates.\n </text>\n </subtext>\n </subtext>\n </subtext>\n </category>\n</page>","/PyTgCalls/Handling Updates.xml": "<page>\n <h1>Handling Updates</h1>\n <text>\n Calling API methods sequentially is cool, but what if, for example, the list of participants changes?\n This page covers updates and how to handle such events in PyTgCalls. Let\u2019s have a look at how they work.\n </text>\n <h2>Defining Updates</h2>\n <text>\n First of all, let's define what these updates are. As hinted earlier, updates are events that happen in PyTgCalls, such as\n joining a group call, changes in the participant list, stream ended etc. They are meant to notify you about a new\n specific state change. These updates are handled by registering one or more callback functions in your app\n using <docs-ref link=\"/PyTgCalls/Decorators\">Decorators</docs-ref>.\n\n Each handler deals with a specific event. When a matching update arrives from Telegram or NTgCalls, the registered callback\n function will be called back by the framework, and its body will execute.\n </text>\n <h2>Registering a Handler</h2>\n <text>\n To explain how handlers work, let's examine the one that will be in charge of handling <code>StreamVideoEnded</code>\n updates, which occur when a video stream ends. The same setup logic is shared with every type of handler, and you should not\n have troubles settings them up once you have learned from this section.\n </text>\n <h3>Using Decorators</h3>\n <text>The most elegant way to register a stream end handler is by using the <docs-ref link=\"\">on_stream_end()</docs-ref> decorator:</text>\n <syntax-highlight>\n from pytgcalls import PyTgCalls, filters\n from pytgcalls.types import Update\n from pytgcalls.types import MediaStream\n ...\n app = PyTgCalls(client)\n\n @app.on_update(filters.stream_end)\n async def my_handler(client: PyTgCalls, update: Update):\n if isinstance(update, StreamVideoEnded):\n await pytgcalls.play(\n -1001185324811,\n stream=MediaStream(\n 'http://docs.evostream.com/sample_content/assets/sintel1m720p.mp4',\n )\n )\n\n app.run()\n </syntax-highlight>\n <text>\n The defined <code>my_handler</code> function, which accepts two arguments (client, update),\n will be executed whenever a new update arrives.\n </text>\n <alert type=\"note\">\n You can mix <code>def</code> and <code>async def</code> handlers as much as you need,\n PyTgCalls will still work concurrently and efficiently regardless of what you choose.\n </alert>\n</page>","/PyTgCalls/Install Guide.xml": "<page>\n <h1>Install Guide</h1>\n <text>\n Being a modern Python library, <b>PyTgCalls</b> requires Python 3.8+ to be installed in your system.\n We recommend using the latest versions of both Python 3 and pip.\n </text>\n <list>\n <item>Get Python 3 from the <a href=\"https://www.python.org/downloads/\">Python website</a> or use your package manager.</item>\n <item>Get pip by following the instructions <a href=\"https://pip.pypa.io/en/latest/installing/\">here</a>.</item>\n </list>\n <alert type=\"important\">PyTgCalls only supports <b>Python 3</b>, starting from version 3.8.</alert>\n <separator/>\n <h2>Install PyTgCalls</h2>\n <text>The easiest way to install and upgrade PyTgCalls to its latest stable version is by using pip:</text>\n <syntax-highlight language=\"bash\">\n $ pip3 install -U py-tgcalls\n </syntax-highlight>\n <h2>Bleeding Edge</h2>\n <text>\n PyTgCalls is always evolving: although new releases on PyPI are only published when a significant number of changes are added,\n this doesn\u2019t mean you can\u2019t try new features right now!\n\n In case you\u2019d like to try out the latest PyTgCalls\u2019 features, the <a href=\"https://github.com/pytgcalls/pytgcalls\">GitHub repo</a> is constantly updated with new changes;\n you can install the development version straight from the <code>master</code> branch using this command (note \u201cmaster.zip\u201d in the link):\n </text>\n <syntax-highlight language=\"bash\">\n $ pip3 install -U git+https://github.com/pytgcalls/pytgcalls\n </syntax-highlight>\n <h2>Verifying</h2>\n <text>To verify that PyTgCalls is correctly installed, open a Python shell and import it. If no errors show up you are good to go.</text>\n <syntax-highlight language=\"python\">\n >>> import pytgcalls\n >>> pytgcalls.__version__\n '<config id=\"PYTGCALLS_VERSION\"/>'\n </syntax-highlight>\n</page>","/PyTgCalls/Media Devices.xml": "<page>\n <h1>Media Devices</h1>\n <text>\n This class offers methods to access information regarding media devices available on your system.\n This functionality proves valuable when you intend to stream content from either your screen or microphone.\n </text>\n <h3>Example</h3>\n <syntax-highlight mark=\"13-15\">\n from pytgcalls import Client\n from pytgcalls import idle\n from pytgcalls.media_devices import MediaDevices\n ...\n\n app = PyTgCalls(client)\n app.start()\n\n ... # Call API methods\n\n app.play(\n -1001185324811,\n MediaStream(\n MediaDevices.get_audio_devices()[0],\n )\n )\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.<sb>MediaDevices</sb></ref>\n </category-title>\n <subtext>\n <text>MediaDevices, the main tool for retrieving media devices list.</text>\n <br/>\n <category>\n <pg-title>METHODS</pg-title>\n <subtext>\n <category-title><ref><sb>get_audio_devices</sb></ref>() <shi>-> list</shi>[pytgcalls.DeviceInfo]</category-title>\n <subtext><text>Retrieve a list of available audio input devices.</text></subtext>\n\n <category-title><ref><sb>get_screen_devices</sb></ref>() <shi>-> list</shi>[pytgcalls.ScreenInfo]</category-title>\n <subtext><text>Retrieve a list of available screen devices</text></subtext>\n </subtext>\n </category>\n </subtext>\n </category>\n</page>","/PyTgCalls/Quick Start.xml": "<page>\n <h1>Quick Start</h1>\n <text>The next few steps serve as a quick start for all new Pythoneers that want to see PyTgCalls in action as quickly as possible. Let\u2019s go!</text>\n <h2>Get PyTgCalls Real Fast</h2>\n <list style=\"numbers\">\n <item>Install PyTgCalls with <code><shi language=\"bash\">pip3 install -U py-tgcalls</shi></code>.</item>\n <item>\n Choose your MTProto client between <a href=\"https://github.com/PyrogramMod/PyrogramMod\">PyrogramMod (ex Pyrogram)</a>,\n <a href=\"https://github.com/LonamiWebs/Telethon\">Telethon</a> or <a href=\"https://github.com/AmanoTeam/hydrogram\">Hydrogram</a>.\n </item>\n <item>Get your own Telegram API key from <a href=\"https://my.telegram.org/apps\">my.telegram.org</a></item>\n <item>\n Open your favorite text editor and use the following:\n <syntax-highlight>\n from pytgcalls import PyTgCalls\n from pytgcalls import idle\n from pytgcalls.types import MediaStream\n ...\n chat_id = -1001185324811\n app = PyTgCalls(client)\n app.start()\n app.play(\n chat_id,\n MediaStream(\n 'http://docs.evostream.com/sample_content/assets/sintel1m720p.mp4',\n )\n )\n idle()\n </syntax-highlight>\n </item>\n <item>Replace <code>client</code> and <code>chat_id</code> values with your own.</item>\n <item>Save the file as <code>main.py</code>.</item>\n <item>Watch PyTgCalls playing the audio file.</item>\n <item>Join our <a href=\"https://t.me/PyTgCallsChat\">community</a>.</item>\n </list>\n <h2>Enjoy the API</h2>\n <text>\n That was just a brief overview that barely scratched the surface!\n In the following few pages of the introduction,\n we\u2019ll have a much more in-depth look at what we have just done.\n\n Are you feeling eager to continue?\n You can take a shortcut to Call Methods and return later to learn more details.\n </text>\n</page>","/PyTgCalls/Stream Descriptors/AudioParameters.xml": "<page>\n <h1>AudioParameters</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.raw.<sb>AudioParameters</sb></ref>\n </category-title>\n <subtext>\n <config id=\"AUDIO_CONFIG_DESC\"/>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>bitrate</ref>: <shi>int</shi></category-title>\n <config id=\"AUDIO_SAMPLE_DESC\"/>\n\n <category-title><ref>channels</ref>: <shi>int</shi></category-title>\n <config id=\"AUDIO_CHAN_DESC\"/>\n </subtext>\n <br/>\n <pg-title>STATIC METHODS</pg-title>\n <subtext>\n <category-title><ref><sb>from_quality</sb></ref>(quality: <docs-ref link=\"/PyTgCalls/Available Enums/AudioQuality\">pytgcalls.types.AudioQuality</docs-ref>)</category-title>\n <subtext>\n <alert type=\"warning\">\n <text>\n This method was deprecated on PyTgCalls 1.2.X, use directly\n <docs-ref link=\"/PyTgCalls/Available Enums/AudioQuality\">pytgcalls.types.AudioQuality</docs-ref> in MediaStream instead\n </text>\n </alert>\n <text>Create an AudioParameters instance from an AudioQuality enumeration.</text>\n </subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Stream Descriptors/AudioStream.xml": "<page>\n <h1>AudioStream</h1>\n <alert type=\"warning\">\n <text>This class replaces the deprecated <code>pytgcalls.types.raw.InputAudioStream</code>.</text>\n </alert>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.raw.<sb>AudioStream</sb></ref>\n </category-title>\n <subtext>\n <text>The raw audio stream (PCM16L) descriptor</text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INPUT_MODE\"/>\n\n <category-title><ref>path</ref>: <shi>str</shi></category-title>\n <subtext><text>The audio file path or shell command (PCM16L format only).</text></subtext>\n\n <category-title><ref>parameters</ref>: <docs-ref link=\"/PyTgCalls/Stream Descriptors/AudioParameters\">pytgcalls.types.raw.AudioParameters</docs-ref></category-title>\n <config id=\"ARG_AUDIO_PARAMS_DESC\"/>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Stream Descriptors/MediaStream.xml": "<page>\n <h1>MediaStream</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>MediaStream</sb></ref>\n </category-title>\n <subtext>\n <text>The media stream piped descriptor.</text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>media_path</ref>: Union[<shi>str</shi>, ScreenInfo, DeviceInfo]</category-title>\n <subtext><text>The audio, video, image or media device path.</text></subtext>\n\n <config id=\"ARG_AUDIO_PARAMSv2\"/>\n <config id=\"ARG_VIDEO_PARAMSv2\"/>\n\n <category-title><ref>audio_path</ref>: Optional[Union[<shi>str</shi>, DeviceInfo]]</category-title>\n <subtext><text>The audio or input audio device path.</text></subtext>\n\n <category-title><ref>audio_flags</ref>: Optional[<docs-ref link=\"/PyTgCalls/Available Enums/MediaStream Flags\">Flags</docs-ref>]</category-title>\n <subtext>\n <text>\n Flag used to control the handling of the audio stream in the media. It allows the system to decide whether to automatically detect, ignore, or require the audio stream.\n </text>\n </subtext>\n\n <category-title><ref>video_flags</ref>: Optional[<docs-ref link=\"/PyTgCalls/Available Enums/MediaStream Flags\">Flags</docs-ref>]</category-title>\n <subtext>\n <text>\n Flag used to control the handling of the video stream in the media. It allows the system to decide whether to automatically detect, ignore, or require the video stream.\n </text>\n </subtext>\n\n <config id=\"ARG_HTTP_PARAMS\"/>\n <category-title><ref>ffmpeg_parameters</ref>: Optional[<shi>str</shi>]</category-title>\n <subtext><text>FFmpeg additional parameters.</text></subtext>\n <category-title><ref>ytdlp_parameters</ref>: Optional[<shi>str</shi>]</category-title>\n <subtext><text>yt-dlp additional parameters.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Stream Descriptors/Stream.xml": "<page>\n <h1>Stream</h1>\n <alert type=\"warning\">\n <text>This class replaces the deprecated <code>pytgcalls.types.InputStream</code>.</text>\n </alert>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.<sb>Stream</sb></ref>\n </category-title>\n <subtext>\n <text>Stream Descriptor.</text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <category-title><ref>stream_audio</ref>: <docs-ref link=\"/PyTgCalls/Stream Descriptors/AudioStream\">pytgcalls.types.raw.AudioStream</docs-ref></category-title>\n <subtext><text>Audio Stream Descriptor.</text></subtext>\n\n <category-title><ref>stream_video</ref>: <docs-ref link=\"/PyTgCalls/Stream Descriptors/VideoStream\">pytgcalls.types.raw.VideoStream</docs-ref></category-title>\n <subtext><text>Video Stream Descriptor.</text></subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Stream Descriptors/VideoParameters.xml": "<page>\n <h1>VideoParameters</h1>\n <br/>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.raw.<sb>VideoParameters</sb></ref>\n </category-title>\n <subtext>\n <text>Stream\u2019s video parameters.</text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_VIDEO_CONFIG\"/>\n\n <category-title><ref>frame_rate</ref>: <shi>int</shi></category-title>\n <config id=\"VIDEO_FPS_DESC\"/>\n\n <category-title><ref>adjust_by_height</ref>: <shi>bool</shi></category-title>\n <subtext><text>Adjust the video resolution by height instead of width.</text></subtext>\n </subtext>\n <br/>\n <pg-title>STATIC METHODS</pg-title>\n <subtext>\n <category-title><ref><sb>from_quality</sb></ref>(quality: <docs-ref link=\"/PyTgCalls/Available Enums/VideoQuality\">pytgcalls.types.VideoQuality</docs-ref>)</category-title>\n <subtext>\n <alert type=\"warning\">\n <text>\n This method was deprecated on PyTgCalls 1.2.X, use directly\n <docs-ref link=\"/PyTgCalls/Available Enums/VideoQuality\">pytgcalls.types.VideoQuality</docs-ref> in MediaStream instead\n </text>\n </alert>\n <text>Create an VideoParameters instance from an VideoQuality enumeration.</text>\n </subtext>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Stream Descriptors/VideoStream.xml": "<page>\n <h1>VideoStream</h1>\n <alert type=\"warning\">\n <text>This class replaces the deprecated <code>pytgcalls.types.InputVideoStream</code>.</text>\n </alert>\n <category-title noref=\"true\">\n <shi>class</shi> <ref src=\"class\">pytgcalls.types.raw.<sb>VideoStream</sb></ref>\n </category-title>\n <subtext>\n <text>The raw video stream (YUV420P) descriptor</text>\n <br/>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_INPUT_MODE\"/>\n\n <category-title><ref>path</ref>: <shi>str</shi></category-title>\n <subtext><text>The video file path or shell command (YUV420P format only).</text></subtext>\n\n <category-title><ref>parameters </ref>: <docs-ref link=\"/PyTgCalls/Stream Descriptors/VideoParameters\">pytgcalls.types.raw.VideoParameters</docs-ref></category-title>\n <config id=\"ARG_VIDEO_PARAMS_DESC\"/>\n </subtext>\n </subtext>\n</page>","/PyTgCalls/Stream Methods/Mute Stream.xml": "<page>\n <h1>Mute Stream</h1>\n <text>This method allows muting the userbot via MTProto APIs.</text>\n <h3>Example</h3>\n <syntax-highlight mark=\"10-12\">\n from pytgcalls import Client\n from pytgcalls import idle\n ...\n\n app = PyTgCalls(client)\n app.start()\n\n ... # Call API methods\n\n app.mute_stream(\n -1001185324811,\n )\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>mute_stream</sb></ref>() <shi>-> bool</shi>\n </category-title>\n <subtext>\n <text>Mute the userbot</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"BASE_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Stream Methods/Pause Stream.xml": "<page>\n <h1>Pause Stream</h1>\n <text>This method allows pausing the streaming file.</text>\n <h3>Example</h3>\n <syntax-highlight mark=\"10-12\">\n from pytgcalls import Client\n from pytgcalls import idle\n ...\n\n app = PyTgCalls(client)\n app.start()\n\n ... # Call API methods\n\n app.pause_stream(\n -1001185324811,\n )\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>pause_stream</sb></ref>() <shi>-> bool</shi>\n </category-title>\n <subtext>\n <text>Pause the stream</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"BASE_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Stream Methods/Played Time.xml": "<page>\n <h1>Played Time</h1>\n <config id=\"TIME_DESC\"/>\n <h3>Example</h3>\n <syntax-highlight mark=\"11-13\">\n from pytgcalls import Client\n from pytgcalls import idle\n ...\n\n app = PyTgCalls(client)\n app.start()\n\n ... # Call API methods\n\n print(\n app.played_time(\n -1001185324811,\n )\n )\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>played_time</sb></ref>() <shi>-> int</shi>\n </category-title>\n <subtext>\n <config id=\"TIME_DESC_2\"/>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"BASE_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Stream Methods/Resume Stream.xml": "<page>\n <h1>Resume Stream</h1>\n <text>This method allows resuming the streaming file.</text>\n <h3>Example</h3>\n <syntax-highlight mark=\"10-12\">\n from pytgcalls import Client\n from pytgcalls import idle\n ...\n\n app = PyTgCalls(client)\n app.start()\n\n ... # Call API methods\n\n app.resume_stream(\n -1001185324811,\n )\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>resume_stream</sb></ref>() <shi>-> bool</shi>\n </category-title>\n <subtext>\n <text>Resume the stream</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"BASE_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Stream Methods/UnMute Stream.xml": "<page>\n <h1>UnMute Stream</h1>\n <text>This method allows unmuting the userbot via MTProto APIs</text>\n <h3>Example</h3>\n <syntax-highlight mark=\"10-12\">\n from pytgcalls import Client\n from pytgcalls import idle\n ...\n\n app = PyTgCalls(client)\n app.start()\n\n ... # Call API methods\n\n app.unmute_stream(\n -1001185324811,\n )\n\n idle()\n </syntax-highlight>\n <separator/>\n <h2>Details</h2>\n <category-title noref=\"true\">\n <ref src=\"method\">PyTgCalls.<sb>unmute_stream</sb></ref>() <shi>-> bool</shi>\n </category-title>\n <subtext>\n <text>UnMute the userbot</text>\n <br/>\n <category>\n <pg-title>PARAMETERS</pg-title>\n <subtext>\n <config id=\"ARG_CHAT_ID\"/>\n </subtext>\n </category>\n <br/>\n <category>\n <pg-title>RAISES</pg-title>\n <subtext>\n <config id=\"BASE_EXCEPTIONS\"/>\n </subtext>\n </category>\n </subtext>\n</page>","/PyTgCalls/Using Filters.xml": "<page>\n <h1>Using Filters</h1>\n <text>\n So far we\u2019ve seen <docs-ref link=\"/PyTgCalls/Decorators\">how to register a decorator</docs-ref> function that executes every time an update comes from the server,\n but there\u2019s much more than that to come.\n\n Here we\u2019ll discuss <docs-ref link=\"/PyTgCalls/Filters\">filters</docs-ref>. Filters enable a fine-grain control over what kind of updates are allowed or\n not to be passed in your callback functions, based on their inner details.\n </text>\n <separator/>\n <h2>Single Filters</h2>\n <text>Let\u2019s start right away with a simple example:</text>\n <list>\n <item>\n <text>\n This example will show you how to only handle updates that are an Incoming Call\n and ignore any other update. Filters are passed as the first argument of the decorator:\n <syntax-highlight>\n from pytgcalls import filters\n from pytgcalls.types import ChatUpdate\n ...\n @pytgcalls.on_update(filters.chat_update(ChatUpdate.Status.INCOMING_CALL))\n def on_incoming_call(client, update):\n print(\"Incoming call!\", update)\n </syntax-highlight>\n </text>\n </item>\n <item>\n <text>\n or, without decorators. Here filters are passed as the second argument of the add_handler function;\n the first is the callback function itself:\n <syntax-highlight>\n from pytgcalls import filters\n from pytgcalls.types import ChatUpdate\n ...\n def on_incoming_call(client, update):\n print(\"Incoming call!\", update)\n\n pytgcalls.add_handler(on_incoming_call, filters.chat_update(ChatUpdate.Status.INCOMING_CALL))\n </syntax-highlight>\n </text>\n </item>\n </list>\n <h2>Combining Filters</h2>\n <text>\n Filters can be used in a more advanced way by inverting and combining more filters together using bitwise operators <code>~</code>, <code>&</code> and <code>|</code>:\n <list>\n <item>\n <item>Use <code>~</code> to invert a filter (behaves like the <code>not</code> operator).</item>\n </item>\n <item>\n <item>Use <code>&</code> and <code>|</code> to combine filters together (behaves like the <code>and</code> and <code>or</code> operators).</item>\n </item>\n </list>\n Here are some examples:\n <list>\n <item>\n <text>\n This example will show you how to only handle updates that are <b>left</b> updates from a specific <b>chat</b> and ignore any other update:\n <syntax-highlight>\n from pytgcalls import filters\n from pytgcalls.types import ChatUpdate\n ...\n @pytgcalls.on_update(~filters.chat_update(ChatUpdate.Status.LEFT_GROUP) & filters.chat(1234567890))\n def on_incoming_voice_call(client, update):\n print(\"Left chat!\", update)\n </syntax-highlight>\n </text>\n </item>\n <item>\n <text>\n This example will show you how to only handle updates that are <b>left</b> updates or <b>incoming call</b> updates and from a specific <b>chat</b>:\n <syntax-highlight>\n from pytgcalls import filters\n from pytgcalls.types import ChatUpdate\n ...\n @pytgcalls.on_update(filters.chat(1234567890) & (filters.chat_update(ChatUpdate.Status.LEFT_GROUP) | filters.chat_update(ChatUpdate.Status.INCOMING_CALL)))\n def on_incoming_voice_call(client, update):\n print(\"Incoming voice call or left chat!\", update)\n </syntax-highlight>\n </text>\n </item>\n </list>\n </text>\n</page>","/PyTgCalls/Using Handlers.xml": "<page>\n <h1>Update Handlers</h1>\n <text>\n Handlers are used to instruct PyTgCalls to execute a specific function when a certain event occurs.\n For a much more convenient way to handle updates, you can use the <docs-ref link=\"/PyTgCalls/Decorators\">decorators</docs-ref> instead.\n </text>\n <separator/>\n <h2>Registering Handlers</h2>\n <text>\n To register a handler, you need to use the <ref>add_handler</ref> method.\n This method takes two arguments: the first is the callback function, and the second is the filter.\n </text>\n <syntax-highlight>\n from pytgcalls import PyTgCalls\n from pytgcalls.types import Update\n from pytgcalls import filters as call_filters\n ...\n\n client = # Here Your MTProto Client\n app = PyTgCalls(client)\n\n async def handler(client: PyTgCalls, update: Update):\n print(update)\n\n app.add_handler(handler, call_filters.stream_end)\n ...\n </syntax-highlight>\n <h2>Removing Handlers</h2>\n <text>\n To remove a handler, you need to use the <ref>remove_handler</ref> method.\n This method takes the callback function as its only argument.\n </text>\n <syntax-highlight>\n from pytgcalls import PyTgCalls\n from pytgcalls.types import Update\n ...\n\n client = # Here Your MTProto Client\n app = PyTgCalls(client)\n\n async def handler(client: PyTgCalls, update: Update):\n print(update)\n\n app.remove_handler(handler)\n ...\n </syntax-highlight>\n</page>"}