
    OJnix                     b    d dl Z d dlZd dlmZ ddlmZmZ ddlmZm	Z	 ddl
mZ  G d d	e      Zy)
    N)
itemgetter   )
StreamDatawrap_stream)	async_reqget_response_status   )BaseLiveStreamc                   ~     e Zd ZdZddedz  dedz  f fdZdefdZdded	edefd
Z	ddedee
z  dz  defdZ xZS )TikTokLiveStreamzM
    A class for fetching and processing TikTok live stream information.
    N
proxy_addrcookiesc                 P    t         |   ||       | j                         | _        y N)super__init___get_pc_headers
pc_headers)selfr   r   	__class__s      W/home/uftp/myenv/lib/python3.12/site-packages/streamget/platforms/tiktok/live_stream.pyr   zTikTokLiveStream.__init__   s"    W-..0    returnc                 ,    dd| j                   xs dddS )NzPMozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0z;zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2ztt-target-idc=useast5zhttps://www.tiktok.com/live)z
user-agentzaccept-languagecookiereferer)r   )r   s    r   r   z TikTokLiveStream._get_pc_headers   s"    l\ll=&=4	
 	
r   urlprocess_datac                   K   t        || j                  | j                  d       d{   }d|v r=t        j                  d|      }t        d|r|j                  d             d       d	|vrLt        j                  d
|t        j                        }|st        d      t        j                  |d         }|S y7 w)a)  
        Fetches web stream data for a live room.

        Args:
            url (str): The room URL.
            process_data (bool): Whether to process the data. Defaults to True.

        Returns:
            dict: A dictionary containing anchor name, live status, room URL, and title.
        Fr   r   headershttp2NzBWe regret to inform you that we have discontinued operating TikTokzE<p>
\s+(We regret to inform you that we have discontinu.*?)\.
\s+</p>zzYour proxy node's regional network is blocked from accessing TikTok; please switch to a node in another region to access.     UNEXPECTED_EOF_WHILE_READINGz><script id="SIGI_STATE" type="application/json">(.*?)</script>zCPlease check if your network can access the TikTok website normallyr   )r   r   r   researchConnectionErrorgroupfindallDOTALLjsonloads)r   r   r   html_strmsgjson_str	json_datas          r   fetch_web_stream_dataz&TikTokLiveStream.fetch_web_stream_data   s      #stPTP_P_glmmOS[[))hjrsC!-=@SYYq\,IK FH,IK  *9zzPRZ\^\e\egH%&kll

8A;/I : ns   'CC BCr1   video_qualityc                   K   |st        dddd      S dt        fd}|d   d   }|d	   }|d
    d|d    }|j                  dd      }d|dd}|dk(  rd|d   vrt        d      |d   d   d   d   }	t	        j
                  |	      j                  di       }	 ||	d      }
 ||	d      }t        |
      dk  r#|
j                  |
d          t        |
      dk  r#t        |      dk  r#|j                  |d          t        |      dk  r#| j                  |      \  }}|
|   }||   }|j                  d      xs |j                  d      }t        || j                  | j                  d       d{   }|s|dk  r|dz   n|dz
  }|
|   }||   }|d   j                  dd      }|d   j                  dd      }|d|d   d    ||||xs |d!z  }t        |      S 7 jw)"z_
        Fetches the stream URL for a live room and wraps it into a StreamData object.
        TikTokNF)platformanchor_nameis_liver   c                 ,   g }| D ]  }| |   d   }|d   }t        j                  |      }t        |d         }|j                  dd      }d}|j                  |      r?||   j	                  d      s||   j	                  d      r||   dz   |z   }n||   d	z   |z   }|d
   }	|dk7  s|	st        t        |	j                  d            \  }
}|j                  |||
|fd        |j                  t        d      d       |j                  d        |S )Nmain
sdk_paramsvbitrateVCodecr$   z.flvz.m3u8z?codec=z&codec=
resolutionr   x)r   r<   r>   T)keyreversec                 0    | d    | d   d    | d   d    fS )Nr<   r>   r   r#    )r?   s    r   <lambda>zRTikTokLiveStream.fetch_stream_url.<locals>.get_video_quality_url.<locals>.<lambda>O   s/    1Z=.1\?1;M:MPQR^P_`aPbOb)c r   )r@   )
r,   r-   intgetendswithmapsplitappendsortr   )streamq_key	play_listr@   url_infor;   r<   v_codecplay_urlr>   widthheights               r   get_video_quality_urlz@TikTokLiveStream.fetch_stream_url.<locals>.get_video_quality_url;   s.   I m!#;v.%l3
!ZZ
3
z*56$..26<<&//78E?;S;ST[;\#+E?Y#>#H#+E?Y#>#H'5
q=Z$'Z-=-=c-B$CME6$$X8\aci[j%klm" NNz*5tNDNNcNdr   LiveRoomliveRoomUserInfousernickname-uniqueIdstatus   r	   
streamDataliveRoomzRThis live stream may be uncomfortable for some viewers. Log in to confirm your age	pull_datastream_datadataflvhls   r   r    r#   zhttps://zhttp://Ttitle)r8   rf   qualitym3u8_urlflv_url
record_url)r   listrF   	Exceptionr,   r-   lenrJ   get_quality_indexr   r   r   replace)r   r1   r3   rT   	live_roomrW   r7   r[   resultra   flv_url_listm3u8_url_listquality_indexflv_dict	m3u8_dict	check_urlokindexri   rh   s                       r   fetch_stream_urlz!TikTokLiveStream.fetch_stream_url4   sZ     HTV[\]]	D 	. j)*<=	 j)*!D,<+=>(A& !&
 Q;9Z#88 tuuZ(6{CMRD::d#''3D0u=L1$>Ml#a'##L$45 l#a'm$q($$]2%67 m$q(+/+A+A-+P(M=)-8H+M:I!e,CU0CI*$//4??Z_a aB -:Q->)MTUDU!-e!4"/"6	uo--j)DG '//
IFH":.w7($"&1' F 6""%as    CG$0G$A(G$7G"8A+G$)NN)Tr   )__name__
__module____qualname____doc__strr   dictr   boolr2   rE   r   rz   __classcell__)r   s   @r   r   r   
   ss    13: 1sTz 1
 
s $ RV 4L# L#S3YQUEU L#ak L#r   r   )r,   r&   operatorr   ra   r   r   requests.async_httpr   r   baser
   r   rC   r   r   <module>r      s%     	  + A !v#~ v#r   