Repository: isaackogan/TikTokLive (language: python)

Issue:
Merge pull request #45 from isaackogan/master
Merge


Discussion / hints:

Fix patch:
diff --git a/.sphinx/README.md b/.sphinx/README.md
index 50b5362..8a23886 100644
--- a/.sphinx/README.md
+++ b/.sphinx/README.md
@@ -12,4 +12,6 @@ sphinx-apidoc --ext-autodoc --force -o  . ../TikTokLive ../TikTokLive/proto/tikt
 
 3. Move generated sphinx `/sphinx/_build/html` folder to root, rename to "docs"
 4. Add `.nojekyll` file to new docs folder
-5. Add "CNAME" to new docs folder with value `tiktoklive.isaackogan.com`
\ No newline at end of file
+
+Alernatively: sphinx-apidoc --ext-autodoc --force -o "." "../TikTokLive" "../TikTokLive/proto/tiktok_schema_pb2.py" ; Remove-Item ".\_build" -Recurse ; .\make html ; Remove-Item -Path "..\docs" -Recurse ; Rename-Item "
+.\_build\html" "docs"; Move-Item -Path ".\_build\docs" -Destination "..\"
\ No newline at end of file
diff --git a/.sphinx/_build/doctrees/README.doctree b/.sphinx/_build/doctrees/README.doctree
index b6f8f8e..05070c0 100644
Binary files a/.sphinx/_build/doctrees/README.doctree and b/.sphinx/_build/doctrees/README.doctree differ
diff --git a/.sphinx/_build/doctrees/TikTokLive.client.doctree b/.sphinx/_build/doctrees/TikTokLive.client.doctree
index be40dc3..b40d927 100644
Binary files a/.sphinx/_build/doctrees/TikTokLive.client.doctree and b/.sphinx/_build/doctrees/TikTokLive.client.doctree differ
diff --git a/.sphinx/_build/doctrees/TikTokLive.doctree b/.sphinx/_build/doctrees/TikTokLive.doctree
index 478a94c..1b9df24 100644
Binary files a/.sphinx/_build/doctrees/TikTokLive.doctree and b/.sphinx/_build/doctrees/TikTokLive.doctree differ
diff --git a/.sphinx/_build/doctrees/TikTokLive.proto.doctree b/.sphinx/_build/doctrees/TikTokLive.proto.doctree
index 11e306d..abacd6e 100644
Binary files a/.sphinx/_build/doctrees/TikTokLive.proto.doctree and b/.sphinx/_build/doctrees/TikTokLive.proto.doctree differ
diff --git a/.sphinx/_build/doctrees/TikTokLive.types.doctree b/.sphinx/_build/doctrees/TikTokLive.types.doctree
index dceae0b..11f932e 100644
Binary files a/.sphinx/_build/doctrees/TikTokLive.types.doctree and b/.sphinx/_build/doctrees/TikTokLive.types.doctree differ
diff --git a/.sphinx/_build/doctrees/environment.pickle b/.sphinx/_build/doctrees/environment.pickle
index 344f2d9..d1ba3b2 100644
Binary files a/.sphinx/_build/doctrees/environment.pickle and b/.sphinx/_build/doctrees/environment.pickle differ
diff --git a/.sphinx/_build/doctrees/index.doctree b/.sphinx/_build/doctrees/index.doctree
index 6f93b28..c5cc10e 100644
Binary files a/.sphinx/_build/doctrees/index.doctree and b/.sphinx/_build/doctrees/index.doctree differ
diff --git a/.sphinx/_build/doctrees/modules.doctree b/.sphinx/_build/doctrees/modules.doctree
index 2782dc2..dbbd90b 100644
Binary files a/.sphinx/_build/doctrees/modules.doctree and b/.sphinx/_build/doctrees/modules.doctree differ
diff --git a/.sphinx/dependency_links.txt b/.sphinx/dependency_links.txt
index 8b13789..e69de29 100644
--- a/.sphinx/dependency_links.txt
+++ b/.sphinx/dependency_links.txt
@@ -1,1 +0,0 @@
-
diff --git a/TikTokLive/proto/utilities.py b/TikTokLive/proto/utilities.py
index db1f646..15e29b2 100644
--- a/TikTokLive/proto/utilities.py
+++ b/TikTokLive/proto/utilities.py
@@ -92,12 +92,12 @@ def serialize_message(proto_name: str, data: dict) -> bytes:
     """
     Serialize a message from a dict to a protobuf bytearray
     
-    :param proto_name: The name of the protobuf message to serialize to
+    :param proto_name: The name of the protobuf message to serialize the message to
     :param data: The data to use in serialization
     :return: Bytearray containing the serialized protobuf message
     
     """
-    
+
     schema = getattr(tiktok_schema, proto_name)
     webcast_data = schema()
     return json_format.Parse(json.dumps(data), webcast_data).SerializeToString()
diff --git a/TikTokLive/types/errors.py b/TikTokLive/types/errors.py
index effa1ea..394d3bd 100644
--- a/TikTokLive/types/errors.py
+++ b/TikTokLive/types/errors.py
@@ -37,6 +37,7 @@ class InitialCursorMissing(FailedConnection):
     """
     pass
 
+
 class InvalidSessionId(RuntimeError):
     """
     Error raised when a session ID is expired or missing
@@ -63,6 +64,7 @@ class ChatMessageRepeat(ChatMessageSendFailure):
 
     pass
 
+
 class WebsocketConnectionFailed(RuntimeError):
     """
     Raised when a connection to the TikTok Webcast websocket fails
@@ -71,6 +73,7 @@ class WebsocketConnectionFailed(RuntimeError):
 
     pass
 
+
 class FailedHTTPRequest(RuntimeError):
     """
     Error raised whenever a request fails to HTTP [Generic]
@@ -103,7 +106,7 @@ class FailedFetchGifts(FailedHTTPRequest):
 
 class DownloadStreamError(RuntimeError):
     """
-    Error raised for anything relating to downloading streams
+    Error raised broadly for anything relating to downloading streams
 
     """
 
diff --git a/docs/README.html b/docs/README.html
index c409599..ce55ab2 100644
--- a/docs/README.html
+++ b/docs/README.html
@@ -9,7 +9,7 @@
       <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
   <!--[if lt IE 9]>
     <script src="_static/js/html5shiv.min.js"></script>
-    <![endif]-->
+  <![endif]-->
   
         <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
         <script src="_static/jquery.js"></script>
diff --git a/docs/TikTokLive.client.html b/docs/TikTokLive.client.html
index 27c6af1..439f36b 100644
--- a/docs/TikTokLive.client.html
+++ b/docs/TikTokLive.client.html
@@ -9,7 +9,7 @@
       <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
   <!--[if lt IE 9]>
     <script src="_static/js/html5shiv.min.js"></script>
-    <![endif]-->
+  <![endif]-->
   
         <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
         <script src="_static/jquery.js"></script>
@@ -503,6 +503,11 @@ <h2>Submodules<a class="headerlink" href="#submodules" title="Permalink to this
 </dl>
 </dd></dl>
 
+<dl class="py method">
+<dt class="sig sig-object py" id="TikTokLive.client.websocket.WebcastWebsocket.send_ack">
+<em class="property"><span class="pre">async</span><span class="w"> </span></em><span class="sig-name descname"><span class="pre">send_ack</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">message_id</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#TikTokLive.client.websocket.WebcastWebsocket.send_ack" title="Permalink to this definition"></a></dt>
+<dd></dd></dl>
+
 </dd></dl>
 
 </section>
diff --git a/docs/TikTokLive.html b/docs/TikTokLive.html
index ee4a6dd..df6c565 100644
--- a/docs/TikTokLive.html
+++ b/docs/TikTokLive.html
@@ -9,7 +9,7 @@
       <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
   <!--[if lt IE 9]>
     <script src="_static/js/html5shiv.min.js"></script>
-    <![endif]-->
+  <![endif]-->
   
         <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
         <script src="_static/jquery.js"></script>
diff --git a/docs/TikTokLive.proto.html b/docs/TikTokLive.proto.html
index 6b7458f..8c18123 100644
--- a/docs/TikTokLive.proto.html
+++ b/docs/TikTokLive.proto.html
@@ -9,7 +9,7 @@
       <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
   <!--[if lt IE 9]>
     <script src="_static/js/html5shiv.min.js"></script>
-    <![endif]-->
+  <![endif]-->
   
         <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
         <script src="_static/jquery.js"></script>
@@ -140,6 +140,23 @@ <h2>Submodules<a class="headerlink" href="#submodules" title="Permalink to this
 </dl>
 </dd></dl>
 
+<dl class="py function">
+<dt class="sig sig-object py" id="TikTokLive.proto.utilities.serialize_message">
+<span class="sig-prename descclassname"><span class="pre">TikTokLive.proto.utilities.</span></span><span class="sig-name descname"><span class="pre">serialize_message</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">proto_name</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">data</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">dict</span></span></em><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">bytes</span></span></span><a class="headerlink" href="#TikTokLive.proto.utilities.serialize_message" title="Permalink to this definition"></a></dt>
+<dd><p>Serialize a message from a dict to a protobuf bytearray</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters</dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>proto_name</strong> – The name of the protobuf message to serialize to</p></li>
+<li><p><strong>data</strong> – The data to use in serialization</p></li>
+</ul>
+</dd>
+<dt class="field-even">Returns</dt>
+<dd class="field-even"><p>Bytearray containing the serialized protobuf message</p>
+</dd>
+</dl>
+</dd></dl>
+
 </section>
 <section id="module-TikTokLive.proto">
 <span id="module-contents"></span><h2>Module contents<a class="headerlink" href="#module-TikTokLive.proto" title="Permalink to this heading"></a></h2>
diff --git a/docs/TikTokLive.types.html b/docs/TikTokLive.types.html
index e7469c2..db2d736 100644
--- a/docs/TikTokLive.types.html
+++ b/docs/TikTokLive.types.html
@@ -9,7 +9,7 @@
       <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
   <!--[if lt IE 9]>
     <script src="_static/js/html5shiv.min.js"></script>
-    <![endif]-->
+  <![endif]-->
   
         <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
         <script src="_static/jquery.js"></script>
@@ -887,7 +887,7 @@ <h2>Submodules<a class="headerlink" href="#submodules" title="Permalink to this
 
 <dl class="py class">
 <dt class="sig sig-object py" id="TikTokLive.types.objects.FFmpegWrapper">
-<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">TikTokLive.types.objects.</span></span><span class="sig-name descname"><span class="pre">FFmpegWrapper</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">runtime</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">thread</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Thread</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ffmpeg</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">FFmpeg</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verbose</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">path</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">started_at</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">-</span> <span class="pre">1</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#TikTokLive.types.objects.FFmpegWrapper" title="Permalink to this definition"></a></dt>
+<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">TikTokLive.types.objects.</span></span><span class="sig-name descname"><span class="pre">FFmpegWrapper</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">runtime</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Optional</span><span class="p"><span class="pre">[</span></span><span class="pre">str</span><span class="p"><span class="pre">]</span></span></span></em>, <em class="sig-param"><span class="n"><span class="pre">thread</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">Thread</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ffmpeg</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">FFmpeg</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">verbose</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">bool</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">path</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">started_at</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">int</span></span><span class="w"> </span><span class="o"><span class="pre">=</span></span><span class="w"> </span><span class="default_value"><span class="pre">-1</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#TikTokLive.types.objects.FFmpegWrapper" title="Permalink to this definition"></a></dt>
 <dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
 <p>A wrapper for the FFmpeg Stream Download utility in the TikTokLive Package</p>
 <dl class="py attribute">
diff --git a/docs/_static/basic.css b/docs/_static/basic.css
index 7d5974c..eeb0519 100644
--- a/docs/_static/basic.css
+++ b/docs/_static/basic.css
@@ -608,8 +608,6 @@ ol.simple p,
 ul.simple p {
     margin-bottom: 0;
 }
-
-/* Docutils 0.17 and older (footnotes & citations) */
 dl.footnote > dt,
 dl.citation > dt {
     float: left;
@@ -627,33 +625,6 @@ dl.citation > dd:after {
     clear: both;
 }
 
-/* Docutils 0.18+ (footnotes & citations) */
-aside.footnote > span,
-div.citation > span {
-    float: left;
-}
-aside.footnote > span:last-of-type,
-div.citation > span:last-of-type {
-  padding-right: 0.5em;
-}
-aside.footnote > p {
-  margin-left: 2em;
-}
-div.citation > p {
-  margin-left: 4em;
-}
-aside.footnote > p:last-of-type,
-div.citation > p:last-of-type {
-    margin-bottom: 0em;
-}
-aside.footnote > p:last-of-type:after,
-div.citation > p:last-of-type:after {
-    content: "";
-    clear: both;
-}
-
-/* Footnotes & citations ends */
-
 dl.field-list {
     display: grid;
     grid-template-columns: fit-content(30%) auto;
@@ -665,11 +636,11 @@ dl.field-list > dt {
     padding-left: 0.5em;
     padding-right: 5px;
 }
-
 dl.field-list > dt:after {
     content: ":";
 }
 
+
 dl.field-list > dd {
     padding-left: 0.5em;
     margin-top: 0em;
diff --git a/docs/_static/documentation_options.js b/docs/_static/documentation_options.js
index a750e4d..b57ae3b 100644
--- a/docs/_static/documentation_options.js
+++ b/docs/_static/documentation_options.js
@@ -10,5 +10,5 @@ var DOCUMENTATION_OPTIONS = {
     SOURCELINK_SUFFIX: '.txt',
     NAVIGATION_WITH_KEYS: false,
     SHOW_SEARCH_SUMMARY: true,
-    ENABLE_SEARCH_SHORTCUTS: false,
+    ENABLE_SEARCH_SHORTCUTS: true,
 };
\ No newline at end of file
diff --git a/docs/_static/searchtools.js b/docs/_static/searchtools.js
index ac4d586..f2fb7d5 100644
--- a/docs/_static/searchtools.js
+++ b/docs/_static/searchtools.js
@@ -88,7 +88,7 @@ const _displayItem = (item, highlightTerms, searchTerms) => {
   linkEl.href = linkUrl + "?" + params.toString() + anchor;
   linkEl.innerHTML = title;
   if (descr)
-    listItem.appendChild(document.createElement("span")).innerText =
+    listItem.appendChild(document.createElement("span")).innerHTML =
       " (" + descr + ")";
   else if (showSearchSummary)
     fetch(requestUrl)
@@ -155,10 +155,8 @@ const Search = {
   _pulse_status: -1,
 
   htmlToText: (htmlString) => {
-    const htmlElement = document
-      .createRange()
-      .createContextualFragment(htmlString);
-    _removeChildren(htmlElement.querySelectorAll(".headerlink"));
+    const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
+    htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() });
     const docContent = htmlElement.querySelector('[role="main"]');
     if (docContent !== undefined) return docContent.textContent;
     console.warn(
@@ -504,11 +502,12 @@ const Search = {
    * latter for highlighting it.
    */
   makeSearchSummary: (htmlText, keywords, highlightWords) => {
-    const text = Search.htmlToText(htmlText).toLowerCase();
+    const text = Search.htmlToText(htmlText);
     if (text === "") return null;
 
+    const textLower = text.toLowerCase();
     const actualStartPosition = [...keywords]
-      .map((k) => text.indexOf(k.toLowerCase()))
+      .map((k) => textLower.indexOf(k.toLowerCase()))
       .filter((i) => i > -1)
       .slice(-1)[0];
     const startWithContext = Math.max(actualStartPosition - 120, 0);
@@ -516,9 +515,9 @@ const Search = {
     const top = startWithContext === 0 ? "" : "...";
     const tail = startWithContext + 240 < text.length ? "..." : "";
 
-    let summary = document.createElement("div");
+    let summary = document.createElement("p");
     summary.classList.add("context");
-    summary.innerText = top + text.substr(startWithContext, 240).trim() + tail;
+    summary.textContent = top + text.substr(startWithContext, 240).trim() + tail;
 
     highlightWords.forEach((highlightWord) =>
       _highlightText(summary, highlightWord, "highlighted")
diff --git a/docs/genindex.html b/docs/genindex.html
index c850d52..c5fe2f6 100644
--- a/docs/genindex.html
+++ b/docs/genindex.html
@@ -8,7 +8,7 @@
       <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
   <!--[if lt IE 9]>
     <script src="_static/js/html5shiv.min.js"></script>
-    <![endif]-->
+  <![endif]-->
   
         <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
         <script src="_static/jquery.js"></script>
@@ -651,18 +651,22 @@ <h2 id="R">R</h2>
 <h2 id="S">S</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="TikTokLive.client.html#TikTokLive.client.websocket.WebcastWebsocket.send_ack">send_ack() (TikTokLive.client.websocket.WebcastWebsocket method)</a>
+</li>
       <li><a href="TikTokLive.client.html#TikTokLive.client.base.BaseClient.send_message">send_message() (TikTokLive.client.base.BaseClient method)</a>
+</li>
+      <li><a href="TikTokLive.proto.html#TikTokLive.proto.utilities.serialize_message">serialize_message() (in module TikTokLive.proto.utilities)</a>
 </li>
       <li><a href="TikTokLive.types.html#TikTokLive.types.events.AbstractEvent.set_as_dict">set_as_dict() (TikTokLive.types.events.AbstractEvent method)</a>
 </li>
       <li><a href="TikTokLive.client.html#TikTokLive.client.base.BaseClient.set_proxies">set_proxies() (TikTokLive.client.base.BaseClient method)</a>
 </li>
       <li><a href="TikTokLive.types.html#TikTokLive.types.events.ShareEvent">ShareEvent (class in TikTokLive.types.events)</a>
-</li>
-      <li><a href="TikTokLive.client.html#TikTokLive.client.base.BaseClient.start">start() (TikTokLive.client.base.BaseClient method)</a>
 </li>
   </ul></td>
   <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="TikTokLive.client.html#TikTokLive.client.base.BaseClient.start">start() (TikTokLive.client.base.BaseClient method)</a>
+</li>
       <li><a href="TikTokLive.types.html#TikTokLive.types.objects.FFmpegWrapper.started_at">started_at (TikTokLive.types.objects.FFmpegWrapper attribute)</a>
 </li>
       <li><a href="TikTokLive.client.html#TikTokLive.client.base.BaseClient.stop">stop() (TikTokLive.client.base.BaseClient method)</a>
diff --git a/docs/index.html b/docs/index.html
index 70c61e3..4d23942 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -9,7 +9,7 @@
       <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
   <!--[if lt IE 9]>
     <script src="_static/js/html5shiv.min.js"></script>
-    <![endif]-->
+  <![endif]-->
   
         <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
         <script src="_static/jquery.js"></script>
diff --git a/docs/modules.html b/docs/modules.html
index ccf5e25..da475e2 100644
--- a/docs/modules.html
+++ b/docs/modules.html
@@ -9,7 +9,7 @@
       <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
   <!--[if lt IE 9]>
     <script src="_static/js/html5shiv.min.js"></script>
-    <![endif]-->
+  <![endif]-->
   
         <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
         <script src="_static/jquery.js"></script>
diff --git a/docs/objects.inv b/docs/objects.inv
index 8d7627a..f6230bb 100644
Binary files a/docs/objects.inv and b/docs/objects.inv differ
diff --git a/docs/py-modindex.html b/docs/py-modindex.html
index 684ce90..47a8dbf 100644
--- a/docs/py-modindex.html
+++ b/docs/py-modindex.html
@@ -8,7 +8,7 @@
       <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
   <!--[if lt IE 9]>
     <script src="_static/js/html5shiv.min.js"></script>
-    <![endif]-->
+  <![endif]-->
   
         <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
         <script src="_static/jquery.js"></script>
@@ -78,7 +78,7 @@ <h1>Python Module Index</h1>
        <strong>t</strong></td><td></td></tr>
      <tr>
        <td><img src="_static/minus.png" class="toggler"
-                id="toggle-1" style="display: none" alt="-" /></td>
+              id="toggle-1" style="display: none" alt="-" /></td>
        <td>
        <a href="TikTokLive.html#module-TikTokLive"><code class="xref">TikTokLive</code></a></td><td>
        <em></em></td></tr>
diff --git a/docs/search.html b/docs/search.html
index cc23b87..492779b 100644
--- a/docs/search.html
+++ b/docs/search.html
@@ -9,7 +9,7 @@
     
   <!--[if lt IE 9]>
     <script src="_static/js/html5shiv.min.js"></script>
-    <![endif]-->
+  <![endif]-->
   
         <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
         <script src="_static/jquery.js"></script>
diff --git a/docs/searchindex.js b/docs/searchindex.js
index 8952f44..c492f04 100644
--- a/docs/searchindex.js
+++ b/docs/searchindex.js
@@ -1,1 +1,1 @@
-Search.setIndex({"docnames": ["README", "TikTokLive", "TikTokLive.client", "TikTokLive.proto", "TikTokLive.types", "index", "modules"], "filenames": ["README.md", "TikTokLive.rst", "TikTokLive.client.rst", "TikTokLive.proto.rst", "TikTokLive.types.rst", "index.rst", "modules.rst"], "titles": ["How To Build", "TikTokLive package", "TikTokLive.client package", "TikTokLive.proto package", "TikTokLive.types package", "TikTokLive Docs", "TikTokLive"], "terms": {"complet": 0, "command": [0, 5], "cd": 0, "sphinx": 0, "apidoc": 0, "ext": 0, "autodoc": 0, "forc": 0, "o": 0, "tiktokl": 0, "proto": [0, 1, 2, 4, 5, 6], "tiktok_schema_pb2": 0, "py": 0, "make": [0, 2, 5], "html": [0, 1, 2], "move": 0, "gener": [0, 4], "_build": 0, "folder": [0, 5], "root": 0, "renam": 0, "doc": 0, "add": [0, 5], "nojekyl": 0, "file": [0, 5], "new": [0, 2, 4, 5], "cname": 0, "valu": [0, 4, 5], "isaackogan": [0, 5], "com": [0, 2, 5], "client": [1, 4, 5, 6], "base": [1, 4, 6], "config": [1, 3, 6], "http": [1, 4, 5, 6], "websocket": [1, 3, 4, 5, 6], "type": [1, 3, 5, 6], "error": [1, 2, 6], "event": [1, 2, 6], "object": [1, 2, 3, 5, 6], "get_room_id_from_main_page_html": 1, "main_page_html": 1, "str": [1, 2, 3, 4], "get": [1, 2], "room": [1, 2, 4, 5], "id": [1, 2, 4, 5], "from": [1, 2, 3, 4, 5], "creator": [1, 5], "s": [1, 2, 4, 5], "page": [1, 2], "If": [1, 2, 4, 5], "thi": [1, 5], "fail": [1, 4, 5], "you": [1, 2, 4, 5], "ar": [1, 2, 3, 4, 5], "probabl": 1, "block": [1, 2, 5], "tiktok": [1, 2, 4, 5], "us": [1, 2, 5], "vpn": 1, "return": [1, 2, 3, 4, 5], "The": [1, 2, 3, 4, 5], "validate_and_normalize_unique_id": 1, "unique_id": [1, 2, 5], "take": [1, 5], "host": [1, 4, 5], "format": [1, 2], "convert": 1, "them": 1, "normal": [1, 3], "version": 1, "For": [1, 5], "exampl": [1, 5], "class": [2, 3, 4], "basecli": 2, "loop": [2, 5], "option": [2, 3, 4], "abstracteventloop": 2, "none": [2, 3, 4, 5], "client_param": [2, 5], "dict": [2, 3, 4, 5], "header": [2, 5], "timeout_m": [2, 5], "int": [2, 4, 5], "ping_interval_m": [2, 5], "1000": [2, 5], "process_initial_data": [2, 5], "bool": [2, 4], "true": [2, 4, 5], "enable_extended_gift_info": [2, 5], "trust_env": [2, 5], "fals": [2, 4, 5], "proxi": [2, 5], "lang": [2, 5], "en": [2, 5], "fetch_room_info_on_connect": [2, 5], "websocket_en": [2, 5], "asyncioeventemitt": 2, "respons": [2, 5], "long": [2, 4, 5], "poll": [2, 4, 5], "webcast": [2, 4, 5], "api": [2, 5], "properti": [2, 4, 5], "available_gift": [2, 5], "extendedgift": [2, 4, 5], "avail": [2, 5], "gift": [2, 4], "inform": [2, 4, 5], "live": [2, 4, 5], "info": [2, 4, 5], "connect": [2, 4], "whether": [2, 4, 5], "result": [2, 3, 4, 5], "download": [2, 4, 5], "path": [2, 4], "durat": [2, 4, 5], "verbos": [2, 4], "loglevel": 2, "global_opt": 2, "set": [2, 3, 4, 5], "input": 2, "output": 2, "start": [2, 4], "user": [2, 4, 5], "livestream": [2, 4, 5], "video": [2, 4, 5], "given": [2, 4, 5], "non": [2, 5], "via": [2, 5], "python": [2, 3, 5], "thread": [2, 4, 5], "paramet": [2, 3, 4, 5], "ffmpeg": [2, 4], "log": [2, 4, 5], "level": 2, "pass": [2, 5], "custom": [2, 5], "param": 2, "global": 2, "less": [2, 5], "than": [2, 4, 5], "1": [2, 4, 5], "go": 2, "forev": 2, "about": [2, 4, 5], "consol": [2, 5], "rais": [2, 4], "alreadydownloadingstream": [2, 4], "alreadi": [2, 4], "attempt": [2, 4, 5], "second": [2, 4, 5], "async": [2, 5], "get_proxi": [2, 5], "current": [2, 4, 5], "being": [2, 5], "request": [2, 4, 5], "retrieve_available_gift": [2, 5], "retriev": [2, 5], "retrieve_room_info": [2, 5], "method": 2, "dictionari": [2, 3, 4, 5], "contain": [2, 3, 4, 5], "all": [2, 5], "room_id": [2, 5], "wa": [2, 4], "success": 2, "room_info": [2, 5], "run": [2, 5], "session_id": 2, "while": [2, 5], "main": [2, 5], "send_messag": [2, 5], "text": [2, 4, 5], "send": [2, 4, 5], "messag": [2, 3, 4, 5], "chat": [2, 4, 5], "want": [2, 5], "session": [2, 4, 5], "ve": 2, "suppli": [2, 4, 5], "one": [2, 4, 5], "don": 2, "t": [2, 3, 5], "need": 2, "set_proxi": [2, 5], "Not": 2, "without": [2, 5], "stop": [2, 4, 5], "safe": 2, "stop_download": [2, 5], "notdownloadingstream": [2, 4], "try": [2, 4, 5], "when": [2, 4, 5], "downloadprocessnotfound": [2, 4], "befor": [2, 4, 5], "process": [2, 4, 5], "ha": [2, 4, 5], "open": [2, 4], "uniqu": [2, 5], "streamer": [2, 4, 5], "Their": [2, 4], "viewer_count": [2, 5], "viewer": [2, 4, 5], "count": [2, 4, 5], "tiktoklivecli": [2, 5], "debug": [2, 5], "emit": 2, "asynchron": [2, 5], "default_client_param": 2, "union": 2, "aid": 2, "1988": 2, "app_languag": 2, "app_nam": 2, "tiktok_web": 2, "browser_languag": 2, "browser_nam": 2, "mozilla": 2, "browser_onlin": 2, "browser_platform": 2, "win32": 2, "browser_vers": 2, "5": [2, 4, 5], "0": [2, 5], "window": 2, "nt": 2, "10": [2, 4, 5], "win64": 2, "x64": 2, "applewebkit": 2, "537": 2, "36": 2, "khtml": 2, "like": [2, 4], "gecko": 2, "chrome": 2, "102": 2, "5005": 2, "63": 2, "safari": 2, "cookie_en": 2, "cursor": [2, 4], "device_platform": 2, "web": 2, "did_rul": 2, "3": 2, "fetch_rul": 2, "focus_st": 2, "from_pag": 2, "history_len": 2, "4": 2, "ident": 2, "audienc": 2, "internal_ext": 2, "is_fullscreen": 2, "is_page_vis": 2, "last_rtt": 2, "live_id": 2, "12": 2, "mstoken": 2, "refer": 2, "www": [2, 5], "resp_content_typ": 2, "protobuf": [2, 3], "root_refer": 2, "screen_height": 2, "1152": 2, "screen_width": 2, "2048": 2, "tz_name": 2, "europ": 2, "berlin": 2, "update_version_cod": 2, "version_cod": 2, "180800": 2, "webcast_sdk_vers": 2, "default": [2, 5], "includ": [2, 4, 5], "server": 2, "default_request_head": 2, "accept": 2, "applic": 2, "json": 2, "encod": 2, "gzip": 2, "deflat": 2, "languag": [2, 5], "q": [2, 4], "9": 2, "cach": [2, 5], "control": 2, "max": 2, "ag": 2, "keep": 2, "aliv": 2, "origin": 2, "agent": 2, "url": [2, 4, 5], "webapp": 2, "tiktok_url_web": 2, "tiktok_url_webcast": 2, "extern": 2, "sign": 2, "tiktokhttpcli": 2, "get_deserialized_object_from_webcast_api": 2, "schema": [2, 3], "sign_url": 2, "deseri": [2, 3], "an": [2, 4, 5], "authent": 2, "decod": [2, 3, 5], "data": [2, 3, 4, 5], "httpx": 2, "timeoutexcept": 2, "get_json_object_from_webcast_api": 2, "get_livestream_page_html": 2, "string": 2, "post_json_to_webcast_api": 2, "post": 2, "urlencod": 2, "classmethod": 2, "update_url": 2, "updat": [2, 4, 5], "break": 2, "compon": 2, "ad": [2, 5], "ones": 2, "rebuild": 2, "we": 2, "webcastwebsocket": 2, "ws_url": 2, "ws_param": 2, "cooki": [2, 5], "float": 2, "kwarg": [2, 5], "wrapper": [2, 4, 5], "handl": [2, 4, 5], "close": 2, "noth": 2, "dope": 2, "statu": [2, 4, 5], "successfulli": [2, 5], "initi": [2, 4, 5], "connection_loop": 2, "heartbeat": 2, "is_open": 2, "check": 2, "deserialize_messag": 3, "proto_nam": 3, "obj": 3, "byte": 3, "name": [3, 4, 5], "deserialize_websocket_messag": 3, "binary_messag": 3, "which": [3, 4, 5], "addit": 3, "A": [3, 4, 5], "msg": 3, "repres": 3, "webcastrespons": 3, "binari": 3, "from_dict_plu": 3, "data_class": 3, "ani": [3, 4], "load": 3, "_as_dict": [3, 4], "attribut": [3, 4], "automat": [3, 5], "fit": 3, "dacit": 3, "dataclass": 3, "except": [4, 5], "alreadyconnect": 4, "runtimeerror": 4, "whilst": 4, "downloadstreamerror": 4, "chatmessagerepeat": 4, "chatmessagesendfailur": 4, "someon": [4, 5], "repeat": 4, "found": 4, "usual": 4, "re": 4, "spawn": 4, "anyth": 4, "relat": 4, "stream": [4, 5], "failedconnect": 4, "failedfetchgift": 4, "failedhttprequest": 4, "fetch": [4, 5], "encount": 4, "failedfetchroominfo": 4, "whenev": 4, "failedroompol": 4, "initialcursormiss": 4, "miss": [4, 5], "invalidsessionid": 4, "expir": 4, "livenotfound": 4, "offlin": [4, 5], "doe": 4, "exist": 4, "websocketconnectionfail": 4, "abstractev": [4, 5], "abstract": 4, "as_dict": [4, 5], "copi": 4, "raw": [4, 5], "payload": [4, 5], "set_as_dict": 4, "commentev": [4, 5], "comment": 4, "fire": [4, 5], "utf": 4, "8": 4, "sent": [4, 5], "connectev": [4, 5], "disconnectev": [4, 5], "disconnect": 4, "emoteev": [4, 5], "emot": 4, "subscrib": 4, "person": [4, 5], "who": [4, 5], "envelopeev": [4, 5], "treasureboxdata": [4, 5], "treasureboxus": [4, 5], "envelop": 4, "enclos": 4, "treasur": [4, 5], "box": [4, 5], "followev": [4, 5], "displaytyp": 4, "label": 4, "follow": 4, "giftev": [4, 5], "receiv": [4, 5], "joinev": [4, 5], "join": 4, "through_shar": 4, "thei": 4, "through": 4, "link": [4, 5], "vs": 4, "app": 4, "share": 4, "likeev": [4, 5], "likecount": 4, "totallikecount": 4, "number": [4, 5], "i": [4, 5], "think": 4, "total": 4, "liveendev": [4, 5], "live_end": 4, "end": [4, 5], "micarmiesev": [4, 5], "battlestatu": 4, "battleus": [4, 5], "list": [4, 5], "micarmiesus": 4, "factori": 4, "mic_armi": 4, "dure": [4, 5], "mic": [4, 5], "battl": [4, 5], "its": [4, 5], "progress": [4, 5], "engag": 4, "micbattleev": [4, 5], "micbattleus": 4, "mic_battl": 4, "moreshareev": [4, 5], "more_shar": 4, "shareev": [4, 5], "more": [4, 5], "user123": 4, "peopl": [4, 5], "amount": [4, 5], "have": [4, 5], "off": [4, 5], "questionev": 4, "questiontext": 4, "question": [4, 5], "ask": 4, "intern": [4, 5], "subscribeev": [4, 5], "actionid": 4, "membermessag": 4, "correspond": 4, "sub": 4, "7": 4, "detail": [4, 5], "subscript": [4, 5], "unknownev": [4, 5], "unknown": 4, "other": [4, 5], "librari": 4, "viewercountupdateev": [4, 5], "viewercount": 4, "viewer_count_upd": 4, "view": [4, 5], "weeklyrankingev": [4, 5], "rankcontain": 4, "weekly_rank": 4, "weekli": [4, 5], "rank": [4, 5], "abstractobject": 4, "avatar": 4, "avatar_url": 4, "last": [4, 5], "highest": 4, "qualiti": 4, "badg": 4, "e": 4, "g": 4, "moder": 4, "badgecontain": 4, "imagebadg": 4, "hous": 4, "friend": 4, "imag": [4, 5], "emoteid": 4, "emoteimag": 4, "encapsul": 4, "imageurl": [4, 5], "cdn": 4, "diamond_count": 4, "describ": 4, "event_nam": [4, 5], "icon": 4, "gifticon": 4, "notifi": 4, "is_broadcast_gift": 4, "is_displayed_on_panel": 4, "is_effect_befview": 4, "is_random_gift": 4, "is_grai": 4, "extend": [4, 5], "whole": 4, "lotta": 4, "extra": [4, 5], "currenc": 4, "diamond": 4, "item": 4, "extraattribut": 4, "followrol": 4, "ffmpegwrapp": 4, "runtim": 4, "started_at": 4, "util": [4, 5, 6], "ffmpy": 4, "subprocess": 4, "argument": 4, "how": 4, "time": [4, 5], "began": 4, "occur": [4, 5], "giftid": 4, "repeatcount": 4, "repeatend": 4, "giftdetail": 4, "giftextra": 4, "extended_gift": [4, 5], "veri": [4, 5], "import": [4, 5], "april": 4, "2022": 4, "specif": [4, 5], "multi": 4, "gift_typ": [4, 5], "alia": 4, "gifttyp": 4, "backward": 4, "compat": 4, "repetit": 4, "over": [4, 5], "repeat_count": [4, 5], "repeat_end": [4, 5], "streakabl": [4, 5], "can": [4, 5], "streak": [4, 5], "otherwis": [4, 5], "giftdetailimag": 4, "giftpictureurl": 4, "giftimag": 4, "diamondcount": 4, "giftnam": 4, "timestamp": 4, "receiveruserid": 4, "recipi": 4, "avg_color": 4, "uri": 4, "is_anim": 4, "url_list": 4, "anim": 4, "variou": 4, "size": 4, "imagebadgeimag": 4, "linkus": 4, "userid": 4, "nicknam": [4, 5], "profilepictur": 4, "uniqueid": [4, 5], "linkmicbattl": 4, "profil": 4, "pictur": 4, "eventdetail": 4, "membermessagedetail": 4, "member": 4, "displai": 4, "micarmiesgroup": 4, "point": 4, "group": 4, "presum": 4, "involv": 4, "hostuserid": 4, "battlegroup": [4, 5], "armi": 4, "micbattlegroup": 4, "weeklyrank": 4, "rankitem": 4, "colour": 4, "ui": 4, "400": 4, "top": [4, 5], "coin": 4, "canopen": 4, "is_follow": 4, "watch": [4, 5], "is_friend": 4, "is_moder": 4, "is_new_gift": 4, "gifter": 4, "is_subscrib": 4, "charli": 4, "d": 4, "amelio": 4, "top_gifter_rank": 4, "charlidamelio": 4, "packag": [5, 6], "subpackag": [5, 6], "submodul": [5, 6], "modul": [5, 6], "abov": 5, "tree": 5, "document": 5, "read": 5, "servic": 5, "real": 5, "push": 5, "onli": 5, "allow": 5, "your": 5, "well": 5, "No": 5, "credenti": 5, "requir": 5, "implement": 5, "javascript": 5, "connector": 5, "zerodytrash": 5, "meant": 5, "serv": 5, "altern": 5, "feel": 5, "comfort": 5, "work": 5, "project": 5, "offici": 5, "It": 5, "revers": 5, "engin": 5, "research": 5, "support": 5, "discord": 5, "visit": 5, "channel": 5, "contribut": 5, "idea": 5, "free": 5, "pull": 5, "featur": 5, "fix": 5, "etc": 5, "primari": 5, "resourc": 5, "guid": 5, "david": 5, "usag": 5, "speech": 5, "plai": 5, "sound": 5, "much": 5, "just": 5, "life": 5, "futur": 5, "instal": 5, "easi": 5, "15": 5, "minut": 5, "plug": 5, "printer": 5, "driver": 5, "termin": 5, "As": 5, "access": 5, "everi": 5, "releas": 5, "here": 5, "sampl": 5, "what": 5, "do": 5, "30": 5, "line": 5, "code": 5, "even": 5, "own": 5, "youtub": 5, "come": 5, "pre": 5, "made": 5, "abil": 5, "isn": 5, "strong": 5, "To": 5, "bui": 5, "creat": 5, "ticket": 5, "gg": 5, "4mbw58w5qx": 5, "cannot": 5, "recommend": 5, "enough": 5, "succinct": 5, "understand": 5, "teather": 5, "click": 5, "thumbnail": 5, "warp": 5, "pip": 5, "first": 5, "instanti": 5, "usernam": 5, "isaackogz": 5, "defin": 5, "decor": 5, "def": 5, "on_connect": 5, "_": 5, "notic": 5, "on_com": 5, "f": 5, "callback": 5, "add_listen": 5, "__name__": 5, "__main__": 5, "await": 5, "see": 5, "provid": 5, "configur": 5, "descript": 5, "ye": 5, "broadcast": 5, "find": 5, "officialgeilegisela": 5, "specifi": 5, "old": 5, "enabl": 5, "prevent": 5, "also": 5, "manual": 5, "unconnect": 5, "state": 5, "cost": 5, "polling_interval_m": 5, "interv": 5, "aiohttp": 5, "wait": 5, "should": 5, "asyncio": 5, "activ": 5, "mostli": 5, "nest": 5, "oldskoldj": 5, "timeout": 5, "frequent": 5, "trust": 5, "environ": 5, "variabl": 5, "password": 5, "localhost": 5, "8030": 5, "420": 5, "69": 5, "8031": 5, "chang": 5, "sync": 5, "turn": 5, "listen": 5, "function": 5, "two": 5, "until": 5, "throw": 5, "exclud": 5, "whose": 5, "k": 5, "v": 5, "pair": 5, "either": 5, "callabl": 5, "trigger": 5, "establish": 5, "call": 5, "reconnect": 5, "note": 5, "littl": 5, "bit": 5, "avoid": 5, "rate": 5, "limit": 5, "on_disconnect": 5, "on_lik": 5, "on_join": 5, "arriv": 5, "gleam": 5, "capabl": 5, "increas": 5, "again": 5, "after": 5, "anoth": 5, "signal": 5, "appli": 5, "mean": 5, "onc": 5, "twice": 5, "therefor": 5, "wai": 5, "on_gift": 5, "x": 5, "elif": 5, "els": 5, "on_follow": 5, "on_shar": 5, "viewcount": 5, "out": 5, "between": 5, "yet": 5, "my": 5, "handler": 5, "present": 5, "up": 5, "individu": 5, "warn": 5, "becaus": 5, "caus": 5, "overriden": 5, "isinst": 5, "somerandomerror": 5, "some": 5, "_log_error": 5, "isaac": 5, "kogan": 5, "maintain": 5, "zerodi": 5, "davinc": 5, "introduct": 5, "davidteath": 5, "full": 5, "particip": 5, "under": 5, "mit": 5, "content": 6}, "objects": {"": [[1, 0, 0, "-", "TikTokLive"]], "TikTokLive": [[2, 0, 0, "-", "client"], [3, 0, 0, "-", "proto"], [4, 0, 0, "-", "types"], [1, 0, 0, "-", "utils"]], "TikTokLive.client": [[2, 0, 0, "-", "base"], [2, 0, 0, "-", "client"], [2, 0, 0, "-", "config"], [2, 0, 0, "-", "http"], [2, 0, 0, "-", "websocket"]], "TikTokLive.client.base": [[2, 1, 1, "", "BaseClient"]], "TikTokLive.client.base.BaseClient": [[2, 2, 1, "", "available_gifts"], [2, 2, 1, "", "connected"], [2, 3, 1, "", "download"], [2, 3, 1, "", "get_proxies"], [2, 3, 1, "", "retrieve_available_gifts"], [2, 3, 1, "", "retrieve_room_info"], [2, 2, 1, "", "room_id"], [2, 2, 1, "", "room_info"], [2, 3, 1, "", "run"], [2, 3, 1, "", "send_message"], [2, 3, 1, "", "set_proxies"], [2, 3, 1, "", "start"], [2, 3, 1, "", "stop"], [2, 3, 1, "", "stop_download"], [2, 2, 1, "", "unique_id"], [2, 2, 1, "", "viewer_count"]], "TikTokLive.client.client": [[2, 1, 1, "", "TikTokLiveClient"]], "TikTokLive.client.config": [[2, 4, 1, "", "DEFAULT_CLIENT_PARAMS"], [2, 4, 1, "", "DEFAULT_REQUEST_HEADERS"], [2, 4, 1, "", "TIKTOK_URL_WEB"], [2, 4, 1, "", "TIKTOK_URL_WEBCAST"]], "TikTokLive.client.http": [[2, 1, 1, "", "TikTokHTTPClient"]], "TikTokLive.client.http.TikTokHTTPClient": [[2, 3, 1, "", "get_deserialized_object_from_webcast_api"], [2, 3, 1, "", "get_json_object_from_webcast_api"], [2, 3, 1, "", "get_livestream_page_html"], [2, 3, 1, "", "post_json_to_webcast_api"], [2, 3, 1, "", "update_url"]], "TikTokLive.client.websocket": [[2, 1, 1, "", "WebcastWebsocket"]], "TikTokLive.client.websocket.WebcastWebsocket": [[2, 3, 1, "", "close"], [2, 3, 1, "", "connect"], [2, 3, 1, "", "connection_loop"], [2, 3, 1, "", "is_open"]], "TikTokLive.proto": [[3, 0, 0, "-", "utilities"]], "TikTokLive.proto.utilities": [[3, 5, 1, "", "deserialize_message"], [3, 5, 1, "", "deserialize_websocket_message"], [3, 5, 1, "", "from_dict_plus"]], "TikTokLive.types": [[4, 0, 0, "-", "errors"], [4, 0, 0, "-", "events"], [4, 0, 0, "-", "objects"]], "TikTokLive.types.errors": [[4, 6, 1, "", "AlreadyConnected"], [4, 6, 1, "", "AlreadyConnecting"], [4, 6, 1, "", "AlreadyDownloadingStream"], [4, 6, 1, "", "ChatMessageRepeat"], [4, 6, 1, "", "ChatMessageSendFailure"], [4, 6, 1, "", "DownloadProcessNotFound"], [4, 6, 1, "", "DownloadStreamError"], [4, 6, 1, "", "FailedConnection"], [4, 6, 1, "", "FailedFetchGifts"], [4, 6, 1, "", "FailedFetchRoomInfo"], [4, 6, 1, "", "FailedHTTPRequest"], [4, 6, 1, "", "FailedRoomPolling"], [4, 6, 1, "", "InitialCursorMissing"], [4, 6, 1, "", "InvalidSessionId"], [4, 6, 1, "", "LiveNotFound"], [4, 6, 1, "", "NotDownloadingStream"], [4, 6, 1, "", "WebsocketConnectionFailed"]], "TikTokLive.types.events": [[4, 1, 1, "", "AbstractEvent"], [4, 1, 1, "", "CommentEvent"], [4, 1, 1, "", "ConnectEvent"], [4, 1, 1, "", "DisconnectEvent"], [4, 1, 1, "", "EmoteEvent"], [4, 1, 1, "", "EnvelopeEvent"], [4, 1, 1, "", "FollowEvent"], [4, 1, 1, "", "GiftEvent"], [4, 1, 1, "", "JoinEvent"], [4, 1, 1, "", "LikeEvent"], [4, 1, 1, "", "LiveEndEvent"], [4, 1, 1, "", "MicArmiesEvent"], [4, 1, 1, "", "MicBattleEvent"], [4, 1, 1, "", "MoreShareEvent"], [4, 1, 1, "", "QuestionEvent"], [4, 1, 1, "", "ShareEvent"], [4, 1, 1, "", "SubscribeEvent"], [4, 1, 1, "", "UnknownEvent"], [4, 1, 1, "", "ViewerCountUpdateEvent"], [4, 1, 1, "", "WeeklyRankingEvent"]], "TikTokLive.types.events.AbstractEvent": [[4, 2, 1, "", "as_dict"], [4, 7, 1, "", "name"], [4, 3, 1, "", "set_as_dict"]], "TikTokLive.types.events.CommentEvent": [[4, 7, 1, "", "comment"], [4, 7, 1, "", "name"], [4, 7, 1, "", "user"]], "TikTokLive.types.events.ConnectEvent": [[4, 7, 1, "", "name"]], "TikTokLive.types.events.DisconnectEvent": [[4, 7, 1, "", "name"]], "TikTokLive.types.events.EmoteEvent": [[4, 7, 1, "", "emote"], [4, 7, 1, "", "name"], [4, 7, 1, "", "user"]], "TikTokLive.types.events.EnvelopeEvent": [[4, 7, 1, "", "name"], [4, 7, 1, "", "treasureBoxData"], [4, 7, 1, "", "treasureBoxUser"]], "TikTokLive.types.events.FollowEvent": [[4, 7, 1, "", "displayType"], [4, 7, 1, "", "label"], [4, 7, 1, "", "name"], [4, 7, 1, "", "user"]], "TikTokLive.types.events.GiftEvent": [[4, 7, 1, "", "gift"], [4, 7, 1, "", "name"], [4, 7, 1, "", "user"]], "TikTokLive.types.events.JoinEvent": [[4, 7, 1, "", "displayType"], [4, 7, 1, "", "label"], [4, 7, 1, "", "name"], [4, 2, 1, "", "through_share"], [4, 7, 1, "", "user"]], "TikTokLive.types.events.LikeEvent": [[4, 7, 1, "", "displayType"], [4, 7, 1, "", "label"], [4, 7, 1, "", "likeCount"], [4, 7, 1, "", "name"], [4, 7, 1, "", "totalLikeCount"], [4, 7, 1, "", "user"]], "TikTokLive.types.events.LiveEndEvent": [[4, 7, 1, "", "name"]], "TikTokLive.types.events.MicArmiesEvent": [[4, 7, 1, "", "battleStatus"], [4, 7, 1, "", "battleUsers"], [4, 7, 1, "", "name"]], "TikTokLive.types.events.MicBattleEvent": [[4, 7, 1, "", "battleUsers"], [4, 7, 1, "", "name"]], "TikTokLive.types.events.MoreShareEvent": [[4, 2, 1, "", "amount"], [4, 7, 1, "", "name"]], "TikTokLive.types.events.QuestionEvent": [[4, 7, 1, "", "name"], [4, 7, 1, "", "questionText"], [4, 7, 1, "", "user"]], "TikTokLive.types.events.ShareEvent": [[4, 7, 1, "", "displayType"], [4, 7, 1, "", "label"], [4, 7, 1, "", "name"], [4, 7, 1, "", "user"]], "TikTokLive.types.events.SubscribeEvent": [[4, 7, 1, "", "actionId"], [4, 7, 1, "", "event"], [4, 7, 1, "", "name"], [4, 7, 1, "", "user"]], "TikTokLive.types.events.UnknownEvent": [[4, 7, 1, "", "name"]], "TikTokLive.types.events.ViewerCountUpdateEvent": [[4, 7, 1, "", "name"], [4, 7, 1, "", "viewerCount"]], "TikTokLive.types.events.WeeklyRankingEvent": [[4, 7, 1, "", "data"], [4, 7, 1, "", "name"]], "TikTokLive.types.objects": [[4, 1, 1, "", "AbstractObject"], [4, 1, 1, "", "Avatar"], [4, 1, 1, "", "Badge"], [4, 1, 1, "", "BadgeContainer"], [4, 1, 1, "", "Emote"], [4, 1, 1, "", "EmoteImage"], [4, 1, 1, "", "ExtendedGift"], [4, 1, 1, "", "ExtraAttributes"], [4, 1, 1, "", "FFmpegWrapper"], [4, 1, 1, "", "Gift"], [4, 1, 1, "", "GiftDetailImage"], [4, 1, 1, "", "GiftDetails"], [4, 1, 1, "", "GiftExtra"], [4, 1, 1, "", "GiftIcon"], [4, 1, 1, "", "ImageBadge"], [4, 1, 1, "", "ImageBadgeImage"], [4, 1, 1, "", "LinkUser"], [4, 1, 1, "", "MemberMessage"], [4, 1, 1, "", "MemberMessageDetails"], [4, 1, 1, "", "MicArmiesGroup"], [4, 1, 1, "", "MicArmiesUser"], [4, 1, 1, "", "MicBattleGroup"], [4, 1, 1, "", "MicBattleUser"], [4, 1, 1, "", "RankContainer"], [4, 1, 1, "", "RankItem"], [4, 1, 1, "", "TreasureBoxData"], [4, 1, 1, "", "User"], [4, 1, 1, "", "WeeklyRanking"]], "TikTokLive.types.objects.Avatar": [[4, 2, 1, "", "avatar_url"], [4, 7, 1, "", "urls"]], "TikTokLive.types.objects.Badge": [[4, 7, 1, "", "name"], [4, 7, 1, "", "type"]], "TikTokLive.types.objects.BadgeContainer": [[4, 7, 1, "", "badges"], [4, 7, 1, "", "imageBadges"]], "TikTokLive.types.objects.Emote": [[4, 7, 1, "", "emoteId"], [4, 7, 1, "", "image"]], "TikTokLive.types.objects.EmoteImage": [[4, 7, 1, "", "imageUrl"]], "TikTokLive.types.objects.ExtendedGift": [[4, 7, 1, "", "describe"], [4, 7, 1, "", "diamond_count"], [4, 7, 1, "", "duration"], [4, 7, 1, "", "event_name"], [4, 7, 1, "", "icon"], [4, 7, 1, "", "id"], [4, 7, 1, "", "image"], [4, 7, 1, "", "is_broadcast_gift"], [4, 7, 1, "", "is_displayed_on_panel"], [4, 7, 1, "", "is_effect_befview"], [4, 7, 1, "", "is_gray"], [4, 7, 1, "", "is_random_gift"], [4, 7, 1, "", "name"], [4, 7, 1, "", "notify"], [4, 7, 1, "", "type"]], "TikTokLive.types.objects.ExtraAttributes": [[4, 7, 1, "", "followRole"]], "TikTokLive.types.objects.FFmpegWrapper": [[4, 7, 1, "", "ffmpeg"], [4, 7, 1, "", "path"], [4, 7, 1, "", "runtime"], [4, 7, 1, "", "started_at"], [4, 7, 1, "", "thread"], [4, 7, 1, "", "verbose"]], "TikTokLive.types.objects.Gift": [[4, 7, 1, "", "extended_gift"], [4, 7, 1, "", "giftDetails"], [4, 7, 1, "", "giftExtra"], [4, 7, 1, "", "giftId"], [4, 2, 1, "", "gift_type"], [4, 7, 1, "", "repeatCount"], [4, 7, 1, "", "repeatEnd"], [4, 2, 1, "", "repeat_count"], [4, 2, 1, "", "repeat_end"], [4, 2, 1, "", "streakable"], [4, 2, 1, "", "streaking"]], "TikTokLive.types.objects.GiftDetailImage": [[4, 7, 1, "", "giftPictureUrl"]], "TikTokLive.types.objects.GiftDetails": [[4, 7, 1, "", "describe"], [4, 7, 1, "", "diamondCount"], [4, 7, 1, "", "giftImage"], [4, 7, 1, "", "giftName"], [4, 7, 1, "", "giftType"]], "TikTokLive.types.objects.GiftExtra": [[4, 7, 1, "", "receiverUserId"], [4, 7, 1, "", "timestamp"]], "TikTokLive.types.objects.GiftIcon": [[4, 7, 1, "", "avg_color"], [4, 7, 1, "", "is_animated"], [4, 7, 1, "", "uri"], [4, 7, 1, "", "url_list"]], "TikTokLive.types.objects.ImageBadge": [[4, 7, 1, "", "displayType"], [4, 7, 1, "", "image"]], "TikTokLive.types.objects.ImageBadgeImage": [[4, 7, 1, "", "url"]], "TikTokLive.types.objects.LinkUser": [[4, 7, 1, "", "nickname"], [4, 7, 1, "", "profilePicture"], [4, 7, 1, "", "uniqueId"], [4, 7, 1, "", "userId"]], "TikTokLive.types.objects.MemberMessage": [[4, 7, 1, "", "eventDetails"]], "TikTokLive.types.objects.MemberMessageDetails": [[4, 7, 1, "", "displayType"], [4, 7, 1, "", "label"]], "TikTokLive.types.objects.MicArmiesGroup": [[4, 7, 1, "", "points"], [4, 7, 1, "", "users"]], "TikTokLive.types.objects.MicArmiesUser": [[4, 7, 1, "", "battleGroups"], [4, 7, 1, "", "hostUserId"]], "TikTokLive.types.objects.MicBattleGroup": [[4, 7, 1, "", "user"]], "TikTokLive.types.objects.MicBattleUser": [[4, 7, 1, "", "battleGroup"]], "TikTokLive.types.objects.RankContainer": [[4, 7, 1, "", "rankings"]], "TikTokLive.types.objects.RankItem": [[4, 7, 1, "", "colour"], [4, 7, 1, "", "id"]], "TikTokLive.types.objects.TreasureBoxData": [[4, 7, 1, "", "canOpen"], [4, 7, 1, "", "coins"], [4, 7, 1, "", "timestamp"]], "TikTokLive.types.objects.User": [[4, 7, 1, "", "badges"], [4, 7, 1, "", "extraAttributes"], [4, 2, 1, "", "is_following"], [4, 2, 1, "", "is_friend"], [4, 2, 1, "", "is_moderator"], [4, 2, 1, "", "is_new_gifter"], [4, 2, 1, "", "is_subscriber"], [4, 7, 1, "", "nickname"], [4, 7, 1, "", "profilePicture"], [4, 2, 1, "", "top_gifter_rank"], [4, 7, 1, "", "uniqueId"], [4, 7, 1, "", "userId"]], "TikTokLive.types.objects.WeeklyRanking": [[4, 7, 1, "", "label"], [4, 7, 1, "", "rank"], [4, 7, 1, "", "type"]], "TikTokLive.utils": [[1, 5, 1, "", "get_room_id_from_main_page_html"], [1, 5, 1, "", "validate_and_normalize_unique_id"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:property", "3": "py:method", "4": "py:data", "5": "py:function", "6": "py:exception", "7": "py:attribute"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "property", "Python property"], "3": ["py", "method", "Python method"], "4": ["py", "data", "Python data"], "5": ["py", "function", "Python function"], "6": ["py", "exception", "Python exception"], "7": ["py", "attribute", "Python attribute"]}, "titleterms": {"how": [0, 5], "To": 0, "build": 0, "tiktokl": [1, 2, 3, 4, 5, 6], "packag": [1, 2, 3, 4], "subpackag": 1, "submodul": [1, 2, 3, 4], "util": [1, 3], "modul": [1, 2, 3, 4], "content": [1, 2, 3, 4, 5], "client": 2, "base": 2, "config": 2, "http": 2, "websocket": 2, "proto": 3, "type": 4, "error": [4, 5], "event": [4, 5], "object": 4, "doc": 5, "tabl": 5, "thermal": 5, "print": 5, "librari": 5, "sale": 5, "purchas": 5, "intro": 5, "tutori": 5, "get": 5, "start": 5, "param": 5, "option": 5, "method": 5, "attribut": 5, "connect": 5, "disconnect": 5, "like": 5, "join": 5, "gift": 5, "follow": 5, "share": 5, "viewer_count_upd": 5, "comment": 5, "emot": 5, "envelop": 5, "subscrib": 5, "weekly_rank": 5, "mic_battl": 5, "mic_armi": 5, "more_shar": 5, "live_end": 5, "unknown": 5, "contributor": 5, "licens": 5}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 56}})
\ No newline at end of file
+Search.setIndex({"docnames": ["README", "TikTokLive", "TikTokLive.client", "TikTokLive.proto", "TikTokLive.types", "index", "modules"], "filenames": ["README.md", "TikTokLive.rst", "TikTokLive.client.rst", "TikTokLive.proto.rst", "TikTokLive.types.rst", "index.rst", "modules.rst"], "titles": ["How To Build", "TikTokLive package", "TikTokLive.client package", "TikTokLive.proto package", "TikTokLive.types package", "TikTokLive Docs", "TikTokLive"], "terms": {"complet": 0, "command": [0, 5], "cd": 0, "sphinx": 0, "apidoc": 0, "ext": 0, "autodoc": 0, "forc": 0, "o": 0, "tiktokl": 0, "proto": [0, 1, 2, 4, 5, 6], "tiktok_schema_pb2": 0, "py": 0, "make": [0, 2, 5], "html": [0, 1, 2], "move": 0, "gener": [0, 4], "_build": 0, "folder": [0, 5], "root": 0, "renam": 0, "doc": 0, "add": [0, 5], "nojekyl": 0, "file": [0, 5], "new": [0, 2, 4, 5], "cname": 0, "valu": [0, 4, 5], "isaackogan": [0, 5], "com": [0, 2, 5], "client": [1, 4, 5, 6], "base": [1, 4, 6], "config": [1, 3, 6], "http": [1, 4, 5, 6], "websocket": [1, 3, 4, 5, 6], "type": [1, 3, 5, 6], "error": [1, 2, 6], "event": [1, 2, 6], "object": [1, 2, 3, 5, 6], "get_room_id_from_main_page_html": 1, "main_page_html": 1, "str": [1, 2, 3, 4], "get": [1, 2], "room": [1, 2, 4, 5], "id": [1, 2, 4, 5], "from": [1, 2, 3, 4, 5], "creator": [1, 5], "": [1, 2, 4, 5], "page": [1, 2], "If": [1, 2, 4, 5], "thi": [1, 5], "fail": [1, 4, 5], "you": [1, 2, 4, 5], "ar": [1, 2, 3, 4, 5], "probabl": 1, "block": [1, 2, 5], "tiktok": [1, 2, 4, 5], "us": [1, 2, 3, 5], "vpn": 1, "return": [1, 2, 3, 4, 5], "The": [1, 2, 3, 4, 5], "validate_and_normalize_unique_id": 1, "unique_id": [1, 2, 5], "take": [1, 5], "host": [1, 4, 5], "format": [1, 2], "convert": 1, "them": 1, "normal": [1, 3], "version": 1, "For": [1, 5], "exampl": [1, 5], "class": [2, 3, 4], "basecli": 2, "loop": [2, 5], "option": [2, 3, 4], "abstracteventloop": 2, "none": [2, 3, 4, 5], "client_param": [2, 5], "dict": [2, 3, 4, 5], "header": [2, 5], "timeout_m": [2, 5], "int": [2, 4, 5], "ping_interval_m": [2, 5], "1000": [2, 5], "process_initial_data": [2, 5], "bool": [2, 4], "true": [2, 4, 5], "enable_extended_gift_info": [2, 5], "trust_env": [2, 5], "fals": [2, 4, 5], "proxi": [2, 5], "lang": [2, 5], "en": [2, 5], "u": [2, 5], "fetch_room_info_on_connect": [2, 5], "websocket_en": [2, 5], "asyncioeventemitt": 2, "respons": [2, 5], "long": [2, 4, 5], "poll": [2, 4, 5], "webcast": [2, 4, 5], "api": [2, 5], "properti": [2, 4, 5], "available_gift": [2, 5], "extendedgift": [2, 4, 5], "avail": [2, 5], "gift": [2, 4], "inform": [2, 4, 5], "live": [2, 4, 5], "info": [2, 4, 5], "connect": [2, 4], "whether": [2, 4, 5], "i": [2, 4, 5], "result": [2, 3, 4, 5], "download": [2, 4, 5], "path": [2, 4], "durat": [2, 4, 5], "verbos": [2, 4], "loglevel": 2, "global_opt": 2, "set": [2, 3, 4, 5], "input": 2, "output": 2, "start": [2, 4], "user": [2, 4, 5], "livestream": [2, 4, 5], "video": [2, 4, 5], "given": [2, 4, 5], "non": [2, 5], "via": [2, 5], "python": [2, 3, 5], "thread": [2, 4, 5], "paramet": [2, 3, 4, 5], "ffmpeg": [2, 4], "log": [2, 4, 5], "level": 2, "pass": [2, 5], "custom": [2, 5], "param": 2, "global": 2, "less": [2, 5], "than": [2, 4, 5], "1": [2, 4, 5], "go": 2, "forev": 2, "about": [2, 4, 5], "consol": [2, 5], "rais": [2, 4], "alreadydownloadingstream": [2, 4], "alreadi": [2, 4], "attempt": [2, 4, 5], "second": [2, 4, 5], "async": [2, 5], "get_proxi": [2, 5], "current": [2, 4, 5], "being": [2, 5], "request": [2, 4, 5], "retrieve_available_gift": [2, 5], "retriev": [2, 5], "retrieve_room_info": [2, 5], "method": 2, "dictionari": [2, 3, 4, 5], "contain": [2, 3, 4, 5], "all": [2, 5], "room_id": [2, 5], "wa": [2, 4], "success": 2, "room_info": [2, 5], "run": [2, 5], "session_id": 2, "while": [2, 5], "main": [2, 5], "send_messag": [2, 5], "text": [2, 4, 5], "send": [2, 4, 5], "messag": [2, 3, 4, 5], "chat": [2, 4, 5], "want": [2, 5], "session": [2, 4, 5], "ve": 2, "suppli": [2, 4, 5], "one": [2, 4, 5], "don": 2, "t": [2, 3, 5], "need": 2, "set_proxi": [2, 5], "Not": 2, "without": [2, 5], "stop": [2, 4, 5], "safe": 2, "stop_download": [2, 5], "notdownloadingstream": [2, 4], "try": [2, 4, 5], "when": [2, 4, 5], "downloadprocessnotfound": [2, 4], "befor": [2, 4, 5], "process": [2, 4, 5], "ha": [2, 4, 5], "open": [2, 4], "uniqu": [2, 5], "streamer": [2, 4, 5], "Their": [2, 4], "viewer_count": [2, 5], "viewer": [2, 4, 5], "count": [2, 4, 5], "tiktoklivecli": [2, 5], "debug": [2, 5], "emit": 2, "asynchron": [2, 5], "default_client_param": 2, "union": 2, "aid": 2, "1988": 2, "app_languag": 2, "app_nam": 2, "tiktok_web": 2, "browser_languag": 2, "browser_nam": 2, "mozilla": 2, "browser_onlin": 2, "browser_platform": 2, "win32": 2, "browser_vers": 2, "5": [2, 4, 5], "0": [2, 5], "window": 2, "nt": 2, "10": [2, 4, 5], "win64": 2, "x64": 2, "applewebkit": 2, "537": 2, "36": 2, "khtml": 2, "like": [2, 4], "gecko": 2, "chrome": 2, "102": 2, "5005": 2, "63": 2, "safari": 2, "cookie_en": 2, "cursor": [2, 4], "device_platform": 2, "web": 2, "did_rul": 2, "3": 2, "fetch_rul": 2, "focus_st": 2, "from_pag": 2, "history_len": 2, "4": 2, "ident": 2, "audienc": 2, "internal_ext": 2, "is_fullscreen": 2, "is_page_vis": 2, "last_rtt": 2, "live_id": 2, "12": 2, "mstoken": 2, "refer": 2, "www": [2, 5], "resp_content_typ": 2, "protobuf": [2, 3], "root_refer": 2, "screen_height": 2, "1152": 2, "screen_width": 2, "2048": 2, "tz_name": 2, "europ": 2, "berlin": 2, "update_version_cod": 2, "version_cod": 2, "180800": 2, "webcast_sdk_vers": 2, "default": [2, 5], "includ": [2, 4, 5], "server": 2, "default_request_head": 2, "accept": 2, "applic": 2, "json": 2, "encod": 2, "gzip": 2, "deflat": 2, "languag": [2, 5], "q": [2, 4], "9": 2, "cach": [2, 5], "control": 2, "max": 2, "ag": 2, "keep": 2, "aliv": 2, "origin": 2, "agent": 2, "url": [2, 4, 5], "webapp": 2, "tiktok_url_web": 2, "tiktok_url_webcast": 2, "extern": 2, "sign": 2, "tiktokhttpcli": 2, "get_deserialized_object_from_webcast_api": 2, "schema": [2, 3], "sign_url": 2, "deseri": [2, 3], "an": [2, 4, 5], "authent": 2, "decod": [2, 3, 5], "data": [2, 3, 4, 5], "httpx": 2, "timeoutexcept": 2, "get_json_object_from_webcast_api": 2, "get_livestream_page_html": 2, "string": 2, "post_json_to_webcast_api": 2, "post": 2, "urlencod": 2, "classmethod": 2, "update_url": 2, "updat": [2, 4, 5], "break": 2, "compon": 2, "ad": [2, 5], "ones": 2, "rebuild": 2, "we": 2, "webcastwebsocket": 2, "ws_url": 2, "ws_param": 2, "cooki": [2, 5], "float": 2, "kwarg": [2, 5], "wrapper": [2, 4, 5], "handl": [2, 4, 5], "close": 2, "noth": 2, "dope": 2, "statu": [2, 4, 5], "successfulli": [2, 5], "initi": [2, 4, 5], "connection_loop": 2, "heartbeat": 2, "is_open": 2, "check": 2, "send_ack": 2, "message_id": 2, "deserialize_messag": 3, "proto_nam": 3, "obj": 3, "byte": 3, "name": [3, 4, 5], "deserialize_websocket_messag": 3, "binary_messag": 3, "which": [3, 4, 5], "addit": 3, "A": [3, 4, 5], "msg": 3, "repres": 3, "webcastrespons": 3, "binari": 3, "from_dict_plu": 3, "data_class": 3, "ani": [3, 4], "load": 3, "_as_dict": [3, 4], "attribut": [3, 4], "automat": [3, 5], "fit": 3, "dacit": 3, "dataclass": 3, "serialize_messag": 3, "serial": 3, "bytearrai": 3, "except": [4, 5], "alreadyconnect": 4, "runtimeerror": 4, "whilst": 4, "downloadstreamerror": 4, "chatmessagerepeat": 4, "chatmessagesendfailur": 4, "someon": [4, 5], "repeat": 4, "found": 4, "usual": 4, "re": 4, "spawn": 4, "anyth": 4, "relat": 4, "stream": [4, 5], "failedconnect": 4, "failedfetchgift": 4, "failedhttprequest": 4, "fetch": [4, 5], "encount": 4, "failedfetchroominfo": 4, "whenev": 4, "failedroompol": 4, "initialcursormiss": 4, "miss": [4, 5], "invalidsessionid": 4, "expir": 4, "livenotfound": 4, "offlin": [4, 5], "doe": 4, "exist": 4, "websocketconnectionfail": 4, "abstractev": [4, 5], "abstract": 4, "as_dict": [4, 5], "copi": 4, "raw": [4, 5], "payload": [4, 5], "set_as_dict": 4, "commentev": [4, 5], "comment": 4, "fire": [4, 5], "utf": 4, "8": 4, "sent": [4, 5], "connectev": [4, 5], "disconnectev": [4, 5], "disconnect": 4, "emoteev": [4, 5], "emot": 4, "subscrib": 4, "person": [4, 5], "who": [4, 5], "envelopeev": [4, 5], "treasureboxdata": [4, 5], "treasureboxus": [4, 5], "envelop": 4, "enclos": 4, "treasur": [4, 5], "box": [4, 5], "followev": [4, 5], "displaytyp": 4, "label": 4, "follow": 4, "giftev": [4, 5], "receiv": [4, 5], "joinev": [4, 5], "join": 4, "through_shar": 4, "thei": 4, "through": 4, "link": [4, 5], "v": [4, 5], "app": 4, "share": 4, "likeev": [4, 5], "likecount": 4, "totallikecount": 4, "number": [4, 5], "think": 4, "total": 4, "liveendev": [4, 5], "live_end": 4, "end": [4, 5], "micarmiesev": [4, 5], "battlestatu": 4, "battleus": [4, 5], "list": [4, 5], "micarmiesus": 4, "factori": 4, "mic_armi": 4, "dure": [4, 5], "mic": [4, 5], "battl": [4, 5], "its": [4, 5], "progress": [4, 5], "engag": 4, "micbattleev": [4, 5], "micbattleus": 4, "mic_battl": 4, "moreshareev": [4, 5], "more_shar": 4, "shareev": [4, 5], "more": [4, 5], "user123": 4, "peopl": [4, 5], "amount": [4, 5], "have": [4, 5], "off": [4, 5], "questionev": 4, "questiontext": 4, "question": [4, 5], "ask": 4, "intern": [4, 5], "subscribeev": [4, 5], "actionid": 4, "membermessag": 4, "correspond": 4, "sub": 4, "7": 4, "detail": [4, 5], "subscript": [4, 5], "unknownev": [4, 5], "unknown": 4, "other": [4, 5], "librari": 4, "viewercountupdateev": [4, 5], "viewercount": 4, "viewer_count_upd": 4, "view": [4, 5], "weeklyrankingev": [4, 5], "rankcontain": 4, "weekly_rank": 4, "weekli": [4, 5], "rank": [4, 5], "abstractobject": 4, "avatar": 4, "avatar_url": 4, "last": [4, 5], "highest": 4, "qualiti": 4, "badg": 4, "e": 4, "g": 4, "moder": 4, "badgecontain": 4, "imagebadg": 4, "hous": 4, "friend": 4, "imag": [4, 5], "emoteid": 4, "emoteimag": 4, "encapsul": 4, "imageurl": [4, 5], "cdn": 4, "diamond_count": 4, "describ": 4, "event_nam": [4, 5], "icon": 4, "gifticon": 4, "notifi": 4, "is_broadcast_gift": 4, "is_displayed_on_panel": 4, "is_effect_befview": 4, "is_random_gift": 4, "is_grai": 4, "extend": [4, 5], "whole": 4, "lotta": 4, "extra": [4, 5], "currenc": 4, "diamond": 4, "item": 4, "extraattribut": 4, "followrol": 4, "ffmpegwrapp": 4, "runtim": 4, "started_at": 4, "util": [4, 5, 6], "ffmpy": 4, "subprocess": 4, "argument": 4, "how": 4, "time": [4, 5], "began": 4, "occur": [4, 5], "giftid": 4, "repeatcount": 4, "repeatend": 4, "giftdetail": 4, "giftextra": 4, "extended_gift": [4, 5], "veri": [4, 5], "import": [4, 5], "april": 4, "2022": 4, "specif": [4, 5], "multi": 4, "gift_typ": [4, 5], "alia": 4, "gifttyp": 4, "backward": 4, "compat": 4, "repetit": 4, "over": [4, 5], "repeat_count": [4, 5], "repeat_end": [4, 5], "streakabl": [4, 5], "can": [4, 5], "streak": [4, 5], "otherwis": [4, 5], "giftdetailimag": 4, "giftpictureurl": 4, "giftimag": 4, "diamondcount": 4, "giftnam": 4, "timestamp": 4, "receiveruserid": 4, "recipi": 4, "avg_color": 4, "uri": 4, "is_anim": 4, "url_list": 4, "anim": 4, "variou": 4, "size": 4, "imagebadgeimag": 4, "linkus": 4, "userid": 4, "nicknam": [4, 5], "profilepictur": 4, "uniqueid": [4, 5], "linkmicbattl": 4, "profil": 4, "pictur": 4, "eventdetail": 4, "membermessagedetail": 4, "member": 4, "displai": 4, "micarmiesgroup": 4, "point": 4, "group": 4, "presum": 4, "involv": 4, "hostuserid": 4, "battlegroup": [4, 5], "armi": 4, "micbattlegroup": 4, "weeklyrank": 4, "rankitem": 4, "colour": 4, "ui": 4, "400": 4, "top": [4, 5], "coin": 4, "canopen": 4, "is_follow": 4, "watch": [4, 5], "is_friend": 4, "is_moder": 4, "is_new_gift": 4, "gifter": 4, "is_subscrib": 4, "charli": 4, "d": 4, "amelio": 4, "top_gifter_rank": 4, "charlidamelio": 4, "packag": [5, 6], "subpackag": [5, 6], "submodul": [5, 6], "modul": [5, 6], "abov": 5, "tree": 5, "document": 5, "read": 5, "servic": 5, "real": 5, "push": 5, "onli": 5, "allow": 5, "your": 5, "well": 5, "No": 5, "credenti": 5, "requir": 5, "implement": 5, "javascript": 5, "connector": 5, "zerodytrash": 5, "meant": 5, "serv": 5, "altern": 5, "feel": 5, "comfort": 5, "work": 5, "project": 5, "offici": 5, "It": 5, "revers": 5, "engin": 5, "research": 5, "support": 5, "discord": 5, "visit": 5, "channel": 5, "contribut": 5, "idea": 5, "free": 5, "pull": 5, "featur": 5, "fix": 5, "etc": 5, "primari": 5, "resourc": 5, "guid": 5, "david": 5, "usag": 5, "speech": 5, "plai": 5, "sound": 5, "much": 5, "just": 5, "life": 5, "futur": 5, "instal": 5, "easi": 5, "15": 5, "minut": 5, "plug": 5, "printer": 5, "driver": 5, "termin": 5, "As": 5, "access": 5, "everi": 5, "releas": 5, "here": 5, "sampl": 5, "what": 5, "do": 5, "30": 5, "line": 5, "code": 5, "even": 5, "own": 5, "youtub": 5, "come": 5, "pre": 5, "made": 5, "abil": 5, "isn": 5, "strong": 5, "To": 5, "bui": 5, "creat": 5, "ticket": 5, "gg": 5, "4mbw58w5qx": 5, "cannot": 5, "recommend": 5, "enough": 5, "succinct": 5, "understand": 5, "teather": 5, "click": 5, "thumbnail": 5, "warp": 5, "pip": 5, "first": 5, "instanti": 5, "usernam": 5, "isaackogz": 5, "defin": 5, "decor": 5, "def": 5, "on_connect": 5, "_": 5, "notic": 5, "on_com": 5, "f": 5, "callback": 5, "add_listen": 5, "__name__": 5, "__main__": 5, "await": 5, "see": 5, "provid": 5, "configur": 5, "descript": 5, "ye": 5, "broadcast": 5, "find": 5, "officialgeilegisela": 5, "specifi": 5, "old": 5, "enabl": 5, "prevent": 5, "also": 5, "manual": 5, "unconnect": 5, "state": 5, "cost": 5, "polling_interval_m": 5, "interv": 5, "aiohttp": 5, "wait": 5, "should": 5, "asyncio": 5, "activ": 5, "mostli": 5, "nest": 5, "oldskoldj": 5, "timeout": 5, "frequent": 5, "trust": 5, "environ": 5, "variabl": 5, "password": 5, "localhost": 5, "8030": 5, "420": 5, "69": 5, "8031": 5, "chang": 5, "sync": 5, "turn": 5, "listen": 5, "function": 5, "two": 5, "until": 5, "throw": 5, "exclud": 5, "whose": 5, "k": 5, "pair": 5, "either": 5, "callabl": 5, "trigger": 5, "establish": 5, "call": 5, "reconnect": 5, "note": 5, "littl": 5, "bit": 5, "avoid": 5, "rate": 5, "limit": 5, "on_disconnect": 5, "on_lik": 5, "on_join": 5, "arriv": 5, "gleam": 5, "capabl": 5, "increas": 5, "again": 5, "after": 5, "anoth": 5, "signal": 5, "appli": 5, "mean": 5, "onc": 5, "twice": 5, "therefor": 5, "wai": 5, "on_gift": 5, "x": 5, "elif": 5, "els": 5, "on_follow": 5, "on_shar": 5, "viewcount": 5, "out": 5, "between": 5, "yet": 5, "my": 5, "handler": 5, "present": 5, "up": 5, "individu": 5, "warn": 5, "becaus": 5, "caus": 5, "overriden": 5, "isinst": 5, "somerandomerror": 5, "some": 5, "_log_error": 5, "isaac": 5, "kogan": 5, "maintain": 5, "zerodi": 5, "davinc": 5, "introduct": 5, "davidteath": 5, "full": 5, "particip": 5, "under": 5, "mit": 5, "content": 6}, "objects": {"": [[1, 0, 0, "-", "TikTokLive"]], "TikTokLive": [[2, 0, 0, "-", "client"], [3, 0, 0, "-", "proto"], [4, 0, 0, "-", "types"], [1, 0, 0, "-", "utils"]], "TikTokLive.client": [[2, 0, 0, "-", "base"], [2, 0, 0, "-", "client"], [2, 0, 0, "-", "config"], [2, 0, 0, "-", "http"], [2, 0, 0, "-", "websocket"]], "TikTokLive.client.base": [[2, 1, 1, "", "BaseClient"]], "TikTokLive.client.base.BaseClient": [[2, 2, 1, "", "available_gifts"], [2, 2, 1, "", "connected"], [2, 3, 1, "", "download"], [2, 3, 1, "", "get_proxies"], [2, 3, 1, "", "retrieve_available_gifts"], [2, 3, 1, "", "retrieve_room_info"], [2, 2, 1, "", "room_id"], [2, 2, 1, "", "room_info"], [2, 3, 1, "", "run"], [2, 3, 1, "", "send_message"], [2, 3, 1, "", "set_proxies"], [2, 3, 1, "", "start"], [2, 3, 1, "", "stop"], [2, 3, 1, "", "stop_download"], [2, 2, 1, "", "unique_id"], [2, 2, 1, "", "viewer_count"]], "TikTokLive.client.client": [[2, 1, 1, "", "TikTokLiveClient"]], "TikTokLive.client.config": [[2, 4, 1, "", "DEFAULT_CLIENT_PARAMS"], [2, 4, 1, "", "DEFAULT_REQUEST_HEADERS"], [2, 4, 1, "", "TIKTOK_URL_WEB"], [2, 4, 1, "", "TIKTOK_URL_WEBCAST"]], "TikTokLive.client.http": [[2, 1, 1, "", "TikTokHTTPClient"]], "TikTokLive.client.http.TikTokHTTPClient": [[2, 3, 1, "", "get_deserialized_object_from_webcast_api"], [2, 3, 1, "", "get_json_object_from_webcast_api"], [2, 3, 1, "", "get_livestream_page_html"], [2, 3, 1, "", "post_json_to_webcast_api"], [2, 3, 1, "", "update_url"]], "TikTokLive.client.websocket": [[2, 1, 1, "", "WebcastWebsocket"]], "TikTokLive.client.websocket.WebcastWebsocket": [[2, 3, 1, "", "close"], [2, 3, 1, "", "connect"], [2, 3, 1, "", "connection_loop"], [2, 3, 1, "", "is_open"], [2, 3, 1, "", "send_ack"]], "TikTokLive.proto": [[3, 0, 0, "-", "utilities"]], "TikTokLive.proto.utilities": [[3, 5, 1, "", "deserialize_message"], [3, 5, 1, "", "deserialize_websocket_message"], [3, 5, 1, "", "from_dict_plus"], [3, 5, 1, "", "serialize_message"]], "TikTokLive.types": [[4, 0, 0, "-", "errors"], [4, 0, 0, "-", "events"], [4, 0, 0, "-", "objects"]], "TikTokLive.types.errors": [[4, 6, 1, "", "AlreadyConnected"], [4, 6, 1, "", "AlreadyConnecting"], [4, 6, 1, "", "AlreadyDownloadingStream"], [4, 6, 1, "", "ChatMessageRepeat"], [4, 6, 1, "", "ChatMessageSendFailure"], [4, 6, 1, "", "DownloadProcessNotFound"], [4, 6, 1, "", "DownloadStreamError"], [4, 6, 1, "", "FailedConnection"], [4, 6, 1, "", "FailedFetchGifts"], [4, 6, 1, "", "FailedFetchRoomInfo"], [4, 6, 1, "", "FailedHTTPRequest"], [4, 6, 1, "", "FailedRoomPolling"], [4, 6, 1, "", "InitialCursorMissing"], [4, 6, 1, "", "InvalidSessionId"], [4, 6, 1, "", "LiveNotFound"], [4, 6, 1, "", "NotDownloadingStream"], [4, 6, 1, "", "WebsocketConnectionFailed"]], "TikTokLive.types.events": [[4, 1, 1, "", "AbstractEvent"], [4, 1, 1, "", "CommentEvent"], [4, 1, 1, "", "ConnectEvent"], [4, 1, 1, "", "DisconnectEvent"], [4, 1, 1, "", "EmoteEvent"], [4, 1, 1, "", "EnvelopeEvent"], [4, 1, 1, "", "FollowEvent"], [4, 1, 1, "", "GiftEvent"], [4, 1, 1, "", "JoinEvent"], [4, 1, 1, "", "LikeEvent"], [4, 1, 1, "", "LiveEndEvent"], [4, 1, 1, "", "MicArmiesEvent"], [4, 1, 1, "", "MicBattleEvent"], [4, 1, 1, "", "MoreShareEvent"], [4, 1, 1, "", "QuestionEvent"], [4, 1, 1, "", "ShareEvent"], [4, 1, 1, "", "SubscribeEvent"], [4, 1, 1, "", "UnknownEvent"], [4, 1, 1, "", "ViewerCountUpdateEvent"], [4, 1, 1, "", "WeeklyRankingEvent"]], "TikTokLive.types.events.AbstractEvent": [[4, 2, 1, "", "as_dict"], [4, 7, 1, "", "name"], [4, 3, 1, "", "set_as_dict"]], "TikTokLive.types.events.CommentEvent": [[4, 7, 1, "", "comment"], [4, 7, 1, "", "name"], [4, 7, 1, "", "user"]], "TikTokLive.types.events.ConnectEvent": [[4, 7, 1, "", "name"]], "TikTokLive.types.events.DisconnectEvent": [[4, 7, 1, "", "name"]], "TikTokLive.types.events.EmoteEvent": [[4, 7, 1, "", "emote"], [4, 7, 1, "", "name"], [4, 7, 1, "", "user"]], "TikTokLive.types.events.EnvelopeEvent": [[4, 7, 1, "", "name"], [4, 7, 1, "", "treasureBoxData"], [4, 7, 1, "", "treasureBoxUser"]], "TikTokLive.types.events.FollowEvent": [[4, 7, 1, "", "displayType"], [4, 7, 1, "", "label"], [4, 7, 1, "", "name"], [4, 7, 1, "", "user"]], "TikTokLive.types.events.GiftEvent": [[4, 7, 1, "", "gift"], [4, 7, 1, "", "name"], [4, 7, 1, "", "user"]], "TikTokLive.types.events.JoinEvent": [[4, 7, 1, "", "displayType"], [4, 7, 1, "", "label"], [4, 7, 1, "", "name"], [4, 2, 1, "", "through_share"], [4, 7, 1, "", "user"]], "TikTokLive.types.events.LikeEvent": [[4, 7, 1, "", "displayType"], [4, 7, 1, "", "label"], [4, 7, 1, "", "likeCount"], [4, 7, 1, "", "name"], [4, 7, 1, "", "totalLikeCount"], [4, 7, 1, "", "user"]], "TikTokLive.types.events.LiveEndEvent": [[4, 7, 1, "", "name"]], "TikTokLive.types.events.MicArmiesEvent": [[4, 7, 1, "", "battleStatus"], [4, 7, 1, "", "battleUsers"], [4, 7, 1, "", "name"]], "TikTokLive.types.events.MicBattleEvent": [[4, 7, 1, "", "battleUsers"], [4, 7, 1, "", "name"]], "TikTokLive.types.events.MoreShareEvent": [[4, 2, 1, "", "amount"], [4, 7, 1, "", "name"]], "TikTokLive.types.events.QuestionEvent": [[4, 7, 1, "", "name"], [4, 7, 1, "", "questionText"], [4, 7, 1, "", "user"]], "TikTokLive.types.events.ShareEvent": [[4, 7, 1, "", "displayType"], [4, 7, 1, "", "label"], [4, 7, 1, "", "name"], [4, 7, 1, "", "user"]], "TikTokLive.types.events.SubscribeEvent": [[4, 7, 1, "", "actionId"], [4, 7, 1, "", "event"], [4, 7, 1, "", "name"], [4, 7, 1, "", "user"]], "TikTokLive.types.events.UnknownEvent": [[4, 7, 1, "", "name"]], "TikTokLive.types.events.ViewerCountUpdateEvent": [[4, 7, 1, "", "name"], [4, 7, 1, "", "viewerCount"]], "TikTokLive.types.events.WeeklyRankingEvent": [[4, 7, 1, "", "data"], [4, 7, 1, "", "name"]], "TikTokLive.types.objects": [[4, 1, 1, "", "AbstractObject"], [4, 1, 1, "", "Avatar"], [4, 1, 1, "", "Badge"], [4, 1, 1, "", "BadgeContainer"], [4, 1, 1, "", "Emote"], [4, 1, 1, "", "EmoteImage"], [4, 1, 1, "", "ExtendedGift"], [4, 1, 1, "", "ExtraAttributes"], [4, 1, 1, "", "FFmpegWrapper"], [4, 1, 1, "", "Gift"], [4, 1, 1, "", "GiftDetailImage"], [4, 1, 1, "", "GiftDetails"], [4, 1, 1, "", "GiftExtra"], [4, 1, 1, "", "GiftIcon"], [4, 1, 1, "", "ImageBadge"], [4, 1, 1, "", "ImageBadgeImage"], [4, 1, 1, "", "LinkUser"], [4, 1, 1, "", "MemberMessage"], [4, 1, 1, "", "MemberMessageDetails"], [4, 1, 1, "", "MicArmiesGroup"], [4, 1, 1, "", "MicArmiesUser"], [4, 1, 1, "", "MicBattleGroup"], [4, 1, 1, "", "MicBattleUser"], [4, 1, 1, "", "RankContainer"], [4, 1, 1, "", "RankItem"], [4, 1, 1, "", "TreasureBoxData"], [4, 1, 1, "", "User"], [4, 1, 1, "", "WeeklyRanking"]], "TikTokLive.types.objects.Avatar": [[4, 2, 1, "", "avatar_url"], [4, 7, 1, "", "urls"]], "TikTokLive.types.objects.Badge": [[4, 7, 1, "", "name"], [4, 7, 1, "", "type"]], "TikTokLive.types.objects.BadgeContainer": [[4, 7, 1, "", "badges"], [4, 7, 1, "", "imageBadges"]], "TikTokLive.types.objects.Emote": [[4, 7, 1, "", "emoteId"], [4, 7, 1, "", "image"]], "TikTokLive.types.objects.EmoteImage": [[4, 7, 1, "", "imageUrl"]], "TikTokLive.types.objects.ExtendedGift": [[4, 7, 1, "", "describe"], [4, 7, 1, "", "diamond_count"], [4, 7, 1, "", "duration"], [4, 7, 1, "", "event_name"], [4, 7, 1, "", "icon"], [4, 7, 1, "", "id"], [4, 7, 1, "", "image"], [4, 7, 1, "", "is_broadcast_gift"], [4, 7, 1, "", "is_displayed_on_panel"], [4, 7, 1, "", "is_effect_befview"], [4, 7, 1, "", "is_gray"], [4, 7, 1, "", "is_random_gift"], [4, 7, 1, "", "name"], [4, 7, 1, "", "notify"], [4, 7, 1, "", "type"]], "TikTokLive.types.objects.ExtraAttributes": [[4, 7, 1, "", "followRole"]], "TikTokLive.types.objects.FFmpegWrapper": [[4, 7, 1, "", "ffmpeg"], [4, 7, 1, "", "path"], [4, 7, 1, "", "runtime"], [4, 7, 1, "", "started_at"], [4, 7, 1, "", "thread"], [4, 7, 1, "", "verbose"]], "TikTokLive.types.objects.Gift": [[4, 7, 1, "", "extended_gift"], [4, 7, 1, "", "giftDetails"], [4, 7, 1, "", "giftExtra"], [4, 7, 1, "", "giftId"], [4, 2, 1, "", "gift_type"], [4, 7, 1, "", "repeatCount"], [4, 7, 1, "", "repeatEnd"], [4, 2, 1, "", "repeat_count"], [4, 2, 1, "", "repeat_end"], [4, 2, 1, "", "streakable"], [4, 2, 1, "", "streaking"]], "TikTokLive.types.objects.GiftDetailImage": [[4, 7, 1, "", "giftPictureUrl"]], "TikTokLive.types.objects.GiftDetails": [[4, 7, 1, "", "describe"], [4, 7, 1, "", "diamondCount"], [4, 7, 1, "", "giftImage"], [4, 7, 1, "", "giftName"], [4, 7, 1, "", "giftType"]], "TikTokLive.types.objects.GiftExtra": [[4, 7, 1, "", "receiverUserId"], [4, 7, 1, "", "timestamp"]], "TikTokLive.types.objects.GiftIcon": [[4, 7, 1, "", "avg_color"], [4, 7, 1, "", "is_animated"], [4, 7, 1, "", "uri"], [4, 7, 1, "", "url_list"]], "TikTokLive.types.objects.ImageBadge": [[4, 7, 1, "", "displayType"], [4, 7, 1, "", "image"]], "TikTokLive.types.objects.ImageBadgeImage": [[4, 7, 1, "", "url"]], "TikTokLive.types.objects.LinkUser": [[4, 7, 1, "", "nickname"], [4, 7, 1, "", "profilePicture"], [4, 7, 1, "", "uniqueId"], [4, 7, 1, "", "userId"]], "TikTokLive.types.objects.MemberMessage": [[4, 7, 1, "", "eventDetails"]], "TikTokLive.types.objects.MemberMessageDetails": [[4, 7, 1, "", "displayType"], [4, 7, 1, "", "label"]], "TikTokLive.types.objects.MicArmiesGroup": [[4, 7, 1, "", "points"], [4, 7, 1, "", "users"]], "TikTokLive.types.objects.MicArmiesUser": [[4, 7, 1, "", "battleGroups"], [4, 7, 1, "", "hostUserId"]], "TikTokLive.types.objects.MicBattleGroup": [[4, 7, 1, "", "user"]], "TikTokLive.types.objects.MicBattleUser": [[4, 7, 1, "", "battleGroup"]], "TikTokLive.types.objects.RankContainer": [[4, 7, 1, "", "rankings"]], "TikTokLive.types.objects.RankItem": [[4, 7, 1, "", "colour"], [4, 7, 1, "", "id"]], "TikTokLive.types.objects.TreasureBoxData": [[4, 7, 1, "", "canOpen"], [4, 7, 1, "", "coins"], [4, 7, 1, "", "timestamp"]], "TikTokLive.types.objects.User": [[4, 7, 1, "", "badges"], [4, 7, 1, "", "extraAttributes"], [4, 2, 1, "", "is_following"], [4, 2, 1, "", "is_friend"], [4, 2, 1, "", "is_moderator"], [4, 2, 1, "", "is_new_gifter"], [4, 2, 1, "", "is_subscriber"], [4, 7, 1, "", "nickname"], [4, 7, 1, "", "profilePicture"], [4, 2, 1, "", "top_gifter_rank"], [4, 7, 1, "", "uniqueId"], [4, 7, 1, "", "userId"]], "TikTokLive.types.objects.WeeklyRanking": [[4, 7, 1, "", "label"], [4, 7, 1, "", "rank"], [4, 7, 1, "", "type"]], "TikTokLive.utils": [[1, 5, 1, "", "get_room_id_from_main_page_html"], [1, 5, 1, "", "validate_and_normalize_unique_id"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:property", "3": "py:method", "4": "py:data", "5": "py:function", "6": "py:exception", "7": "py:attribute"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "property", "Python property"], "3": ["py", "method", "Python method"], "4": ["py", "data", "Python data"], "5": ["py", "function", "Python function"], "6": ["py", "exception", "Python exception"], "7": ["py", "attribute", "Python attribute"]}, "titleterms": {"how": [0, 5], "To": 0, "build": 0, "tiktokl": [1, 2, 3, 4, 5, 6], "packag": [1, 2, 3, 4], "subpackag": 1, "submodul": [1, 2, 3, 4], "util": [1, 3], "modul": [1, 2, 3, 4], "content": [1, 2, 3, 4, 5], "client": 2, "base": 2, "config": 2, "http": 2, "websocket": 2, "proto": 3, "type": 4, "error": [4, 5], "event": [4, 5], "object": 4, "doc": 5, "tabl": 5, "thermal": 5, "print": 5, "librari": 5, "sale": 5, "purchas": 5, "intro": 5, "tutori": 5, "get": 5, "start": 5, "param": 5, "option": 5, "method": 5, "attribut": 5, "connect": 5, "disconnect": 5, "like": 5, "join": 5, "gift": 5, "follow": 5, "share": 5, "viewer_count_upd": 5, "comment": 5, "emot": 5, "envelop": 5, "subscrib": 5, "weekly_rank": 5, "mic_battl": 5, "mic_armi": 5, "more_shar": 5, "live_end": 5, "unknown": 5, "contributor": 5, "licens": 5}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 56}})
\ No newline at end of file
diff --git a/setup.py b/setup.py
index 773c085..6ac3999 100644
--- a/setup.py
+++ b/setup.py
@@ -9,7 +9,7 @@
 setuptools.setup(
     name="TikTokLive",
     packages=setuptools.find_packages(),
-    version="4.2.5",
+    version="4.2.6",
     license="MIT",
     description="TikTok Live Connection Client",
     author="Isaac Kogan",
@@ -17,7 +17,7 @@
     url="https://github.com/isaackogan/TikTokLive",
     long_description=long_description,
     long_description_content_type="text/markdown",
-    download_url="https://github.com/isaackogan/TikTokLive/releases/tag/v4.2.5",
+    download_url="https://github.com/isaackogan/TikTokLive/releases/tag/v4.2.6",
     keywords=["tiktok", "tiktok live", "python3", "api", "unofficial"],
     install_requires=[
         "httpx>=0.23.0",  # Make requests


Test patch:
diff --git a/.sphinx/test.sh b/.sphinx/test.sh
new file mode 100644
index 0000000..69f48ff
--- /dev/null
+++ b/.sphinx/test.sh
@@ -0,0 +1,3 @@
+cd 'C:\Users\jeanm\PycharmProjects\TikTokLive\.sphinx' || exit
+sphinx-apidoc --ext-autodoc --force -o  . ../TikTokLive ../TikTokLive/proto/tiktok_schema_pb2.py
+sh -c '.\\make html; exec sh'