
    \d                     H    d Z ddlmZ ddlmZ  G d dej                  ZdS )z@
Chop up shoutcast stream into MP3s and metadata, if available.
    )	copyright)httpc                   p    e Zd ZdZdej        z   ZddZd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd ZdS )ShoutcastClientz
    Shoutcast HTTP stream.

    Modes can be 'length', 'meta' and 'mp3'.

    See U{http://www.smackfu.com/stuff/programming/shoutcast.html}
    for details on the protocol.
    zTwisted Shoutcast client /c                 L    || _         d| _        d | _        d| _        d| _        d S )NFmp3 )pathgot_metadatametaintmetamode
databuffer)selfr   s     ;lib/python3.11/site-packages/twisted/protocols/shoutcast.py__init__zShoutcastClient.__init__   s*    	!    c                     |                      d| j                   |                     d| j                   |                     dd           |                                  d S )NGETz
User-AgentzIcy-MetaData1)sendCommandr   
sendHeader	userAgent
endHeadersr   s    r   connectionMadezShoutcastClient.connectionMade   sZ    	***dn555,,,r   c                     | j         s@|r>t          |                    dd                    dk    r|                    ddd          }t          j                            | |           d S )Nz:    :)	firstLinelensplitreplacer   
HTTPClientlineReceived)r   lines     r   r%   zShoutcastClient.lineReceived%   sg    ~ 	2$ 	24::dA&&''1,,||Cq11$$T400000r   c                 p    |                                 dk    rt          |          | _        d| _        d S d S )Nzicy-metaintT)lowerintr   r   )r   keyvalues      r   handleHeaderzShoutcastClient.handleHeader,   s8    99;;-''u::DL $D ('r   c                 H    | j         r| j        | _        d S | j        | _        d S )N)r    handleResponsePart_with_metadatahandleResponsePart
gotMP3Datar   s    r   handleEndHeadersz ShoutcastClient.handleEndHeaders1   s2      	6&*&KD### '+oD###r   c                     | xj         |z  c_         | j         r- t          | d| j        z                        }|rd S | j         +d S d S )Nz	handle_%s)r   getattrr   )r   datastops      r   r.   z0ShoutcastClient.handleResponsePart_with_metadata;   sg    4o 	=74t}!<==??D  o 	 	 	 	 	r   c                     t          | j        d                   dz  | _        | j        dd          | _        d| _        d S )Nr      r   meta)ordr   	remainingr   r   s    r   handle_lengthzShoutcastClient.handle_lengthB   s:    T_Q/0025/!""-r   c                     t          | j                  | j        k    rI|                     | j        d | j                            | j        | j        d          | _        d| _        d S dS )Nlengthr   )r!   r   r   r0   r   r   s    r   
handle_mp3zShoutcastClient.handle_mp3G   s\    t$,..OODONdlN;<<<"odlnn=DO$DMMM1r   c                 
   t          | j                  | j        k    re| j        r<| j        d | j                 }|                     |                     |                     | j        | j        d          | _        d| _        d S dS )Nr	   r   )r!   r   r:   gotMetaDataparseMetadatar   r   r4   s     r   handle_metazShoutcastClient.handle_metaO   s    t4>11~ ;'7'78  !3!3D!9!9:::"odn.>.>?DO!DMMM1r   c                 X   g }|                     d          D ]}|                                                    dd          }|s-|                     dd          \  }}|                    d          r|                    d          r
|dd         }|                    ||f           |S )N; r
   =r   ')r"   stripr#   
startswithendswithappend)r   r4   r8   chunkr*   r+   s         r   rA   zShoutcastClient.parseMetadataY   s    ZZ__ 	& 	&EKKMM))&"55E S!,,JC$$ $)<)< $adKKe%%%%r   c                      t          d          )zCalled with a list of (key, value) pairs of metadata,
        if metadata is available on the server.

        Will only be called on non-empty metadata.
        implement in subclassNotImplementedError)r   metadatas     r   r@   zShoutcastClient.gotMetaDatae   s     ""9:::r   c                      t          d          )zCalled with chunk of MP3 data.rP   rQ   rB   s     r   r0   zShoutcastClient.gotMP3Datam   s    !"9:::r   N)r   )__name__
__module____qualname____doc__r   versionr   r   r   r%   r,   r1   r.   r;   r>   rC   rA   r@   r0    r   r   r   r      s          ,i.??I     1 1 1% % %
6 6 6    
    
 
 
; ; ;; ; ; ; ;r   r   N)rX   twistedr   twisted.webr   r$   r   rZ   r   r   <module>r]      su                c; c; c; c; c;do c; c; c; c; c;r   