
    OJni                     4    d dl Z d dlZddlmZ  G d d      Zy)    N   )	async_reqc                   0   e Zd ZdZddedz  dedz  fdZdefdZdefdZe	dd	ee
z  dz  defd
       Ze	dedefd       Ze	dedededz  fd       Z	 	 	 ddededededee
z  dz  dee
z  dz  dedz  defdZe	ddededz  dedz  dee   fd       Zy)BaseLiveStreamz.
    Base class for live stream fetchers.
    N
proxy_addrcookiesc                      || _         || _        y)a  
        Initializes a new instance of BaseLiveStream.

        Args:
            proxy_addr (str | None): The proxy address to use for requests. Defaults to None.
            cookies (str | None): The cookies to include in requests. Defaults to None.
        N)r   r   )selfr   r   s      I/home/uftp/myenv/lib/python3.12/site-packages/streamget/platforms/base.py__init__zBaseLiveStream.__init__   s     %    returnc                 *    dd| j                   xs ddS )z~
        Returns headers for mobile requests.

        Returns:
            dict: Mobile headers with default values.
        zMozilla/5.0 (Linux; Android 11; SAMSUNG SM-G973U) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/14.2 Chrome/87.0.4280.141 Mobile Safari/537.36;zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 z
user-agentzaccept-languagecookier   r
   s    r   _get_mobile_headersz"BaseLiveStream._get_mobile_headers   s!    Z\ll(b	
 	
r   c                 *    dd| j                   xs ddS )zv
        Returns headers for PC requests.

        Returns:
            dict: PC headers with default values.
        z}Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0r   r   r   r   r   s    r   _get_pc_headerszBaseLiveStream._get_pc_headers$   s!    I\ll(b	
 	
r   qualityc                    dddddd}| st        |j                               d   S t        |       j                         }|j	                         r%t        |j                               t        |         }||j                  |d      fS )z
        Maps a quality string to its corresponding index.

        Args:
            quality (str | int): The quality string (e.g., 'OD', 'HD') or index.

        Returns:
            tuple: A tuple containing the quality string and its index.
        r      r         )ODUHDHDSDLD)listitemsstrupperisdigitkeysintget)r   QUALITY_MAPPINGquality_strs      r   get_quality_indexz BaseLiveStream.get_quality_index2   s     "#1AQaH--/033'l((* 3356s;7GHKO//Q???r   urlc                     t         j                  j                  |       }t         j                  j                  |j                        }|S )z
        Parses a URL and extracts query parameters.

        Args:
            url (str): The URL to parse.

        Returns:
            dict: A dictionary of query parameters.
        urllibparseurlparseparse_qsquery)r.   
parsed_urlquery_paramss      r   	parse_urlzBaseLiveStream.parse_urlG   s8     \\**3/
||,,Z-=-=>r   paramsc                     t         j                  j                  |       }t         j                  j                  |j                        }||v r||   d   S y)a  
        Extracts a specific query parameter from a URL.

        Args:
            url (str): The URL to parse.
            params (str): The parameter name to extract.

        Returns:
            str | None: The value of the specified parameter, or None if not found.
        r   Nr0   )r.   r9   r6   r7   s       r   
get_paramszBaseLiveStream.get_paramsV   sO     \\**3/
||,,Z-=-=>\!'** "r   m3u8	json_datavideo_qualityurl_typespechls_extra_keyflv_extra_keyplatformc                   K   |d   s	|d|iz  }|S |d   t              dk  r#j                  d          t              dk  r#| j                  |      \  }||d   dd}fd	}	|d
k(  r( |	|      }
 |	|      }||r|d   n|
|r|d   n||
dz  }n-|dk(  r |	|      }
||r|d   n|
|
dz  }n |	|      }|||dz  }|j                  d      |d<   ||d<   |S w)z
        Fetches the stream URL based on the provided data and quality.

        Returns:
            dict: A dictionary containing the stream URL and other relevant information.
        is_liverC   play_url_list   anchor_nameT)rC   rI   rE   c                         }| r||    S |S N )keyplay_urlrF   selected_qualitys     r   get_urlz.BaseLiveStream.get_stream_url.<locals>.get_url   s    $%56H$'8C=5X5r   allm3u8_urlflv_url)rR   rS   
record_urlr<   )rR   rT   )rS   rT   titler   )lenappendr-   r*   )r
   r=   r>   r?   r@   rA   rB   rC   datarP   rR   rS   rF   rO   s               @@r   get_stream_urlzBaseLiveStream.get_stream_urlh   s?     #*h//I!/2- 1$  r!23 - 1$ +/*@*@*O'' $]3
	6 u}-Hm,G59Ij1x379Y/W& D
 }-H$:!6H\deeDm,Gw??D!g.W'Ys   AC!	BC!proxyheadersc                 N  
K   t        | ||       d{   }g }|j                  d      D ]3  }|j                  d      s|j                  |j	                                5 |sU|j                  d      D ]A  }|j	                         j                  d      s#|j                  |j	                                C t        j                  d      }|j                  |      }t        ||      D 	ci c]  \  }}	|	t        |       c}	}
t        |
fdd	      }|S 7 c c}	}w w)
a  
        Fetches a list of play URLs from an M3U8 file.

        Args:
            m3u8 (str): The URL of the M3U8 file.
            proxy (str | None): The proxy address to use. Defaults to None.
            headers (dict | None): Custom headers for the request. Defaults to None.

        Returns:
            List[str]: A list of play URLs sorted by bandwidth (highest first).
        )r   r[   N
zhttps://r<   zBANDWIDTH=(\d+)c                     |    S rK   rL   )r.   url_to_bandwidths    r   <lambda>z2BaseLiveStream.get_play_url_list.<locals>.<lambda>   s    >Ns>S r   T)rM   reverse)r   split
startswithrW   stripendswithrecompilefindallzipr)   sorted)r<   rZ   r[   resprF   ibandwidth_patternbandwidth_list	bandwidthr.   r_   s             @r   get_play_url_listz BaseLiveStream.get_play_url_list   s     twGGD! 	0A||J'$$QWWY/	0 ZZ% 4779%%f-!((34 JJ'9:*2248FI.ZgFhiNIsCY/i}2S]ab H js/   D%D+D%AD%AD%/DD%D%)NNrK   )r<   FNNN)__name__
__module____qualname____doc__r%   r   dictr   r   staticmethodr)   tupler-   r8   r;   boolrY   r#   rp   rL   r   r   r   r      sb   	3: 	sTz 	
T 

 
 @39t#3 @u @ @( s t   + +S +S4Z + +" nsgk48,d ,3 ,RU ,fj ,,/#I,<,TWZ]T]`dTd,'*Tz,=A,\ c #* dUYk eijmen  r   r   )rf   urllib.parser1   requests.async_httpr   r   rL   r   r   <module>r{      s    	  +i ir   