
    Ϫf                     J    d Z ddlmZ ddlmZ  G d dej
                        Zy)z@
Chop up shoutcast stream into MP3s and metadata, if available.
    )	copyright)httpc                   x    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y)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                 J    || _         d| _        d | _        d| _        d| _        y )NFmp3 )pathgot_metadatametaintmetamode
databuffer)selfr
   s     =/usr/lib/python3/dist-packages/twisted/protocols/shoutcast.py__init__zShoutcastClient.__init__   s&    	!    c                     | j                  d| j                         | j                  d| j                         | j                  dd       | j	                          y )NGETz
User-AgentzIcy-MetaData1)sendCommandr
   
sendHeader	userAgent
endHeadersr   s    r   connectionMadezShoutcastClient.connectionMade   s@    		*dnn5,r   c                     | j                   s3|r1t        |j                  dd            dk(  r|j                  ddd      }t        j
                  j                  | |       y )Nz:    :)	firstLinelensplitreplacer   
HTTPClientlineReceived)r   lines     r   r$   zShoutcastClient.lineReceived%   sI    ~~$4::dA&'1,||Cq1$$T40r   c                 Z    |j                         dk(  rt        |      | _        d| _        y y )Nzicy-metaintT)lowerintr   r   )r   keyvalues      r   handleHeaderzShoutcastClient.handleHeader,   s(    99;-'u:DL $D (r   c                 b    | j                   r| j                  | _        y | j                  | _        y )N)r    handleResponsePart_with_metadatahandleResponsePart
gotMP3Datar   s    r   handleEndHeadersz ShoutcastClient.handleEndHeaders1   s)     &*&K&KD# '+ooD#r   c                     | xj                   |z  c_         | j                   r/ t        | d| j                  z               }|ry | j                   r.y y )Nz	handle_%s)r   getattrr   )r   datastops      r   r-   z0ShoutcastClient.handleResponsePart_with_metadata;   s@    4oo=74t}}!<=?D oor   c                 z    t        | j                  d         dz  | _        | j                  dd  | _        d| _        y )Nr      r   meta)ordr   	remainingr   r   s    r   handle_lengthzShoutcastClient.handle_lengthB   s5    T__Q/025//!"-r   c                     t        | j                        | j                  kD  rN| j                  | j                  d | j                          | j                  | j                  d  | _        d| _        y y)Nlengthr   )r    r   r   r/   r   r   s    r   
handle_mp3zShoutcastClient.handle_mp3G   sR    t$,,.OODOONdll;<"oodlln=DO$DMr   c                    t        | j                        | j                  k\  rk| j                  r9| j                  d | j                   }| j                  | j	                  |             | j                  | j                  d  | _        d| _        y y)Nr   r   )r    r   r9   gotMetaDataparseMetadatar   r   r3   s     r   handle_metazShoutcastClient.handle_metaO   sm    t4>>1~~'78  !3!3D!9:"oodnn.>?DO!DMr   c                    g }|j                  d      D ]t  }|j                         j                  dd      }|s&|j                  dd      \  }}|j                  d      r|j	                  d      r|dd }|j                  ||f       v |S )N; r	   =r   ')r!   stripr"   
startswithendswithappend)r   r3   r7   chunkr)   r*   s         r   r@   zShoutcastClient.parseMetadataY   s    ZZ_ 	&EKKM))&"5ES!,JC$)<a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.rO   rP   rA   s     r   r/   zShoutcastClient.gotMP3Datam   s    !"9::r   N)/)__name__
__module____qualname____doc__r   versionr   r   r   r$   r+   r0   r-   r:   r=   rB   r@   r?   r/    r   r   r   r      sU     ,i.?.??I1%
6

;;r   r   N)rX   twistedr   twisted.webr   r#   r   rZ   r   r   <module>r]      s$     c;doo c;r   