Ϫf JdZddlmZddlmZGddej Zy)z@ Chop up shoutcast stream into MP3s and metadata, if available. ) copyright)httpcxeZdZdZdej zZddZdZdZ dZ dZ dZ d Z d Zd Zd Zd ZdZy)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. zTwisted Shoutcast client cJ||_d|_d|_d|_d|_y)NFmp3)path got_metadatametaintmetamode databuffer)selfr s =/usr/lib/python3/dist-packages/twisted/protocols/shoutcast.py__init__zShoutcastClient.__init__s& !  c|jd|j|jd|j|jdd|j y)NGETz User-Agentz Icy-MetaData1) sendCommandr sendHeader userAgent endHeadersrs rconnectionMadezShoutcastClient.connectionMades@  *  dnn5 , rc|js3|r1t|jdddk(r|jddd}tj j ||y)Nz: :) firstLinelensplitreplacer HTTPClient lineReceived)rlines rr$zShoutcastClient.lineReceived%sI~~$4::dA&'1,||Cq1 $$T40rcZ|jdk(rt||_d|_yy)Nz icy-metaintT)lowerintr r )rkeyvalues r handleHeaderzShoutcastClient.handleHeader,s( 99;- 'u:DL $D  (rcb|jr|j|_y|j|_y)N)r handleResponsePart_with_metadatahandleResponsePart gotMP3Datars rhandleEndHeadersz ShoutcastClient.handleEndHeaders1s)   &*&K&KD #'+ooD #rc|xj|z c_|jr/t|d|jz}|ry|jr.yy)Nz handle_%s)rgetattrr )rdatastops rr-z0ShoutcastClient.handleResponsePart_with_metadata;s@ 4oo=74t}}!<=?Doorczt|jddz|_|jdd|_d|_y)Nrrmeta)ordr remainingr rs r handle_lengthzShoutcastClient.handle_lengthBs5T__Q/025//!"- rct|j|jkDrN|j|jd|j|j|jd|_d|_yy)Nlengthr)r rr r/r rs r handle_mp3zShoutcastClient.handle_mp3GsR t $,, . OODOONdll; <"oodlln=DO$DMrct|j|jk\rk|jr9|jd|j}|j|j ||j|jd|_d|_yy)Nrr)r rr9 gotMetaData parseMetadatar rr3s r handle_metazShoutcastClient.handle_metaOsm t 4>> 1~~'78  !3!3D!9:"oodnn.>?DO!DMrcg}|jdD]t}|jjdd}|s&|jdd\}}|jdr|j dr|dd}|j ||fv|S)N;r =r')r!stripr" startswithendswithappend)rr3r7chunkr)r*s rr@zShoutcastClient.parseMetadataYsZZ_ &EKKM))&"5ES!,JC$)<a  KKe % & rctd)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 subclassNotImplementedError)rmetadatas rr?zShoutcastClient.gotMetaDataes ""9::rctd)zCalled with chunk of MP3 data.rOrPrAs rr/zShoutcastClient.gotMP3Datams!"9::rN)/)__name__ __module__ __qualname____doc__rversionrrrr$r+r0r-r:r=rBr@r?r/rrrr sU,i.?.??I 1% 6  ;;rrN)rXtwistedr twisted.webrr#rrZrrr]s$c;dooc;r