
    Cc                        d Z g dZddlZddlmZ ddlmZ ddlmZm	Z
 ddlmZ ddlmZmZ dd	lmZmZm	Z  G d
 de      Z	 G d de	      Z G d de      Z G d de      Z G d de      ZeZ eee	       edd      d               Zy)a  Read and write Ogg FLAC comments.

This module handles FLAC files wrapped in an Ogg bitstream. The first
FLAC stream found is used. For 'naked' FLACs, see mutagen.flac.

This module is based off the specification at
http://flac.sourceforge.net/ogg_mapping.html.
)OggFLACOpendelete    N)BytesIO)
StreamInfo)r   error)VCommentDict)loadfileconvert_error)OggPageOggFileTyper   c                       e Zd Zy)r   N__name__
__module____qualname__     1/usr/lib/python3/dist-packages/mutagen/oggflac.pyr   r          r   r   c                       e Zd Zy)OggFLACHeaderErrorNr   r   r   r   r   r   !   r   r   r   c                   .    e Zd ZdZdZdZdZd Zd Zd Z	y)OggFLACStreamInfozOggFLACStreamInfo()

    Ogg FLAC stream info.

    Attributes:
        length (`float`): File length in seconds, as a float
        channels (`float`): Number of channels
        sample_rate (`int`): Sample rate in Hz"
    r   c           	      B   t        |      }|j                  d   j                  d      s*t        |      }|j                  d   j                  d      s*t        j                  d|j                  d   dd       \  }}| _        }|dk7  rt        d|z        ||fdk7  rt        d	||fz        |j                  | _        t        |j                  d   d
d        }	 t        |      }dD ]  }	t        | |	t        ||	              y # t        $ r}t        |      d }~ww xY w)Nr      FLACz>BBH4s         fLaCzinvalid FLAC marker (%r))   r   zunknown mapping version: %d.%d   )min_blocksizemax_blocksizesample_ratechannelsbits_per_sampletotal_sampleslength)r   packets
startswithstructunpackr   serialr   FLACStreamInfo	FLACErrorsetattrgetattr)
selffileobjpagemajorminorflac	stringobj	flac_infoeattrs
             r   __init__zOggFLACStreamInfo.__init__4   s'   w,,q/,,[97#D ,,q/,,[9+1==dll1oa+,-(udlD7?$%?$%FGGU^v%$0E5>AC Ckk DLLOBC01		(&y1IO 	:DD$	4 89	:  	($Q''	(s   D 	DDDc                     | j                   ry t        j                  || j                  d      }|t        |j
                  t        | j                        z  | _         y )NT)	finishing)r(   r   	find_lastr-   r   positionfloatr$   )r2   r3   r4   s      r   
_post_tagszOggFLACStreamInfo._post_tagsM   sJ    ;;  $++F<$$mmeD,<,<&==r   c                 8    d| j                   | j                  fz  S )NzOgg FLAC, %.2f seconds, %d Hz)r(   r$   )r2   s    r   pprintzOggFLACStreamInfo.pprintU   s#    /KK))3+ + 	+r   N)
r   r   r   __doc__r(   r%   r$   r<   rB   rD   r   r   r   r   r   %   s'     FHK:2>+r   r   c                   $     e Zd Z fdZd Z xZS )OggFLACVCommentc                 @   g }d}|s^t        |      }|j                  |j                  k(  r7|j                  |       |j                  xs t	        |j
                        dkD  }|s^t        t        j                  |      d   dd        }t        t        | +  |d       y )NFr    r      framing)r   r-   appendcompletelenr)   r   
to_packetssuperrG   r<   )r2   r3   infopagesrM   r4   comment	__class__s          r   r<   zOggFLACVComment.__init__\   s     7#D{{dkk)T"==CS->-B	 
 ',,U3A6qr:;ot-gu-Er   c                    |j                  d       t        |      }|j                  d   j                  d      s*t        |      }|j                  d   j                  d      s*|}|j                  dk(  r|j
                  |j
                  k(  s5t        |      }|j                  dk(  s|j
                  |j
                  k(  s5|g}|d   j                  s{t        |d   j                        dkD  s`t        |      }|j
                  |j
                  k(  r|j                  |       |d   j                  st        |d   j                        dkD  s`t        j                  |d      }| j                  d      }|d   dd t        j                  d	t        |            d
d z   |z   }||d<   t        j                  ||d   j                        }t        j                  |||       y)z8Write tag data into the FLAC Vorbis comment packet/page.r   r   r    F)strictrJ   Nz>I)seekr   r)   r*   sequencer-   rM   rN   rL   rO   writer+   packfrom_packetsreplace)	r2   r3   padding_funcr4   
first_page	old_pagesr)   data	new_pagess	            r   _injectzOggFLACVComment._injecti   s   
 	Qw,,q/,,[97#D ,,q/,,[9 
==A%$++9J9J*J7#D ==A%$++9J9J*J F	R=))S21F1F-G!-K7#D{{j///  & R=))S21F1F-G!-K
 $$Yu= zz%z(qz"1~D#d) <RS AADH
(()A,2G2GH	I6r   )r   r   r   r<   rd   __classcell__)rT   s   @r   rG   rG   Z   s    F7r   rG   c                   :    e Zd ZdZeZeZeZ	dgZ
dZdZed        Zy)r   zOggFLAC(filething)

    An Ogg FLAC file.

    Arguments:
        filething (filething)

    Attributes:
        info (`OggFLACStreamInfo`)
        tags (`mutagen._vorbis.VCommentDict`)
    zaudio/x-oggflacNc                 8    |j                  d      d|v d|v z   z  S )Ns   OggSs   FLACr   )r*   )filenamer3   headers      r   scorezOggFLAC.score   s,    !!'*7f#457 	8r   )r   r   r   rE   r   _InforG   _Tagsr   _Error_mimesrQ   tagsstaticmethodrj   r   r   r   r   r      s<    
 EEF FDD8 8r   r   FT)methodwritablec                 r    t        |       }| j                  j                  d       |j                  |        y)z delete(filething)

    Arguments:
        filething (filething)
    Raises:
        mutagen.MutagenError

    Remove tags from a file.
    r   N)r   r3   rY   r   )	filethingts     r   r   r      s.     		A1HHYr   )rE   __all__r+   ior   mutagenr   mutagen.flacr.   r   r/   mutagen._vorbisr	   mutagen._utilr
   r   mutagen.oggr   r   OggErrorr   r   rG   r   r   IOErrorr   r   r   r   <module>r      s    (    I ( 1 ? ?	H 		 	2+
 2+j+7l +7\8k 86  w	& ' r   