
    h                     J    S r SSKJr  SSKJr   " S S\R
                  5      rg)z@
Chop up shoutcast stream into MP3s and metadata, if available.
    )	copyright)httpc                       \ rS rSrSrS\R                  -   rSS jrS r	S r
S rS rS	 rS
 rS rS rS rS rS rSrg)ShoutcastClient   z
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                 H    Xl         SU l        S U l        SU l        SU l        g )NFmp3 )pathgot_metadatametaintmetamode
databuffer)selfr   s     b/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/twisted/protocols/shoutcast.py__init__ShoutcastClient.__init__   s$    	!    c                     U R                  SU R                  5        U R                  SU R                  5        U R                  SS5        U R	                  5         g )NGETz
User-AgentzIcy-MetaData1)sendCommandr   
sendHeader	userAgent
endHeadersr   s    r   connectionMadeShoutcastClient.connectionMade   s@    		*dnn5,r   c                     U R                   (       d9  U(       a2  [        UR                  SS5      5      S:X  a  UR                  SSS5      n[        R
                  R                  X5        g )Nz:    :)	firstLinelensplitreplacer   
HTTPClientlineReceived)r   lines     r   r'   ShoutcastClient.lineReceived%   sG    ~~$4::dA&'1,||Cq1$$T0r   c                 \    UR                  5       S:X  a  [        U5      U l        SU l        g g )Nzicy-metaintT)lowerintr   r   )r   keyvalues      r   handleHeaderShoutcastClient.handleHeader,   s(    99;-'u:DL $D (r   c                 l    U R                   (       a  U R                  U l        g U R                  U l        g )N)r    handleResponsePart_with_metadatahandleResponsePart
gotMP3Datar   s    r   handleEndHeaders ShoutcastClient.handleEndHeaders1   s)     &*&K&KD# '+ooD#r   c                     U =R                   U-  sl         U R                   (       a:  [        U SU R                  -  5      " 5       nU(       a  g U R                   (       a  M9  g g )Nz	handle_%s)r   getattrr   )r   datastops      r   r2   0ShoutcastClient.handleResponsePart_with_metadata;   s@    4oo4t}}!<=?D ooor   c                 z    [        U R                  S   5      S-  U l        U R                  SS  U l        SU l        g )Nr      r    meta)ordr   	remainingr   r   s    r   handle_lengthShoutcastClient.handle_lengthB   s5    T__Q/025//!"-r   c                     [        U R                  5      U R                  :  aN  U R                  U R                  S U R                   5        U R                  U R                  S  U l        SU l        g g)Nlengthr    )r#   r   r   r4   r   r   s    r   
handle_mp3ShoutcastClient.handle_mp3G   sR    t$,,.OODOONdll;<"oodlln=DO$DMr   c                 *   [        U R                  5      U R                  :  ap  U R                  (       a9  U R                  S U R                   nU R                  U R	                  U5      5        U R                  U R                  S  U l        SU l        g g)Nr	   r    )r#   r   r@   gotMetaDataparseMetadatar   r   r9   s     r   handle_metaShoutcastClient.handle_metaO   sm    t4>>1~~'78  !3!3D!9:"oodnn.>?DO!DMr   c                 :   / nUR                  S5       H  nUR                  5       R                  SS5      nU(       d  M,  UR                  SS5      u  pEUR                  S5      (       a  UR	                  S5      (       a  USS nUR                  XE45        M     U$ )N; r
   =r    ')r$   stripr%   
startswithendswithappend)r   r9   r>   chunkr-   r.   s         r   rI   ShoutcastClient.parseMetadataY   s    ZZ_EKKM))&"5ES!,JC$$)<)<aKK% % r   c                     [        S5      e)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   rH   ShoutcastClient.gotMetaDatae   s     ""9::r   c                     [        S5      e)zCalled with chunk of MP3 data.rZ   r[   rJ   s     r   r4   ShoutcastClient.gotMP3Datam   s    !"9::r   )r   r   r3   r   r   r   r@   N)/)__name__
__module____qualname____firstlineno____doc__r   versionr   r   r   r'   r/   r5   r2   rA   rE   rK   rI   rH   r4   __static_attributes__ r   r   r   r      sU     ,i.?.??I1%
6

;;r   r   N)rf   twistedr   twisted.webr   r&   r   ri   r   r   <module>rl      s$     c;doo c;r   