
    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	m
Z
 ddlmZ ddl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)zRead and write Ogg Opus comments.

This module handles Opus files wrapped in an Ogg bitstream. The
first Opus stream found is used.

Based on http://tools.ietf.org/html/draft-terriberry-oggopus-01
)OggOpusOpendelete    N)BytesIO)
StreamInfo)get_sizeloadfileconvert_error)PaddingInfo)VCommentDict)OggPageOggFileTypeerrorc                       e Zd Zy)r   N__name__
__module____qualname__     1/usr/lib/python3/dist-packages/mutagen/oggopus.pyr   r          r   r   c                       e Zd Zy)OggOpusHeaderErrorNr   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y)OggOpusInfozOggOpusInfo()

    Ogg Opus stream information.

    Attributes:
        length (`float`): File length in seconds, as a float
        channels (`int`): Number of channels
    r   c                    t        |      }|j                  d   j                  d      s*t        |      }|j                  d   j                  d      s*|j                  | _        |j                  st        d      t        j                  d|j                  d   dd       \  }| _        }}}}|| _	        |dz	  }|dk7  rt        d|z        y )	Nr      OpusHeadz.page has ID header, but doesn't start a streamz<BBHIhB         zversion %r unsupported)
r   packets
startswithserialfirstr   structunpackchannels_OggOpusInfo__pre_skip)	selffileobjpageversionpre_skiporig_sample_rateoutput_gainchannel_mapmajors	            r   __init__zOggOpusInfo.__init__1   s    w,,q/,,[97#D ,,q/,,[9 kkzz$@B B ia21FG	$-+;[	" 1A:$%=%EFF r   c                     t        j                  || j                  d      }|t        |j                  | j
                  z
  t        d      z  | _        y )NT)	finishingi  )r   	find_lastr$   r   positionr)   floatlength)r*   r+   r,   s      r   
_post_tagszOggOpusInfo._post_tagsF   sB      $++F<$$}}t6%,Fr   c                      d| j                   z  S )NzOgg Opus, %.2f seconds)r9   )r*   s    r   pprintzOggOpusInfo.pprintL   s    (DKK88r   N)	r   r   r   __doc__r9   r(   r3   r:   r<   r   r   r   r   r   $   s$     FHG*G9r   r   c                   .     e Zd ZdZd Z fdZd Z xZS )OggOpusVCommentz+Opus comments embedded in an Ogg bitstream.c                 2   t        |      }|j                  |j                  k7  s|j                  d   j                  d      sDt        |      }|j                  |j                  k7  r%|j                  d   j                  d      sD|g}|d   j                  s~t        |d   j                        dkD  sct        |      }|j                  |d   j                  k(  r|j                  |       |d   j                  st        |d   j                        dkD  sc|S )Nr      OpusTags   )r   r$   r"   r#   completelenappend)r*   r+   infor,   pagess        r   __get_comment_pagesz#OggOpusVComment.__get_comment_pagesS   s    wt{{*LLO..{;7#D t{{*LLO..{; 9%%U2Y->->)?!)C7#D{{eAhoo-T" 9%%U2Y->->)?!)C
 r   c                 j   | j                  ||      }t        j                  |      d   dd  }t        |      }t        t
        |   |d       t        |      | j                  z
  | _	        |j                  d      }|r.t        |      dz  r ||j                         z   | _        d| _	        y d| _        y )Nr   r   FframingrC   r   )#_OggOpusVComment__get_comment_pagesr   
to_packetsr   superr?   r3   rE   _size_paddingreadord	_pad_data)r*   r+   rG   rH   datapadding_flag	__class__s         r   r3   zOggOpusVComment.__init__c   s    (($7!!%(+AB/$-ot-gu-ED	DJJ. ||AC-3)GLLN:DNDM DNr   c                    |j                  d       t        |      }| j                  ||      }t        j                  |      }d| j                  d      z   }| j                  r|| j                  z   |d<   n\t        |      t        |d         z
  }t        |d         t        |      z
  }t        ||      }|j                  |      }	|d|	z  z   |d<   t        j                  ||      }
t        j                  |||
       y )Nr   rA   FrK       )seekr   rM   r   rN   writerT   r   rE   r   _get_padding_from_packets_try_preservereplace)r*   r+   padding_funcrG   	old_pagesr"   vcomment_datacontent_sizepadding_leftnew_padding	new_pagess              r   _injectzOggOpusVComment._injects   s    Q7#,,Wd;	$$Y/#djjj&??>> '7GAJ#G,s71:>Lwqz?S-??L|\:D++L9K&;)>>GAJ66w	J	I6r   )r   r   r   r=   rM   r3   rf   __classcell__)rW   s   @r   r?   r?   P   s    5 ! 7r   r?   c                   <    e Zd ZdZeZeZeZ	ddgZ
dZdZed        Zy)r   zOggOpus(filething)

    An Ogg Opus file.

    Arguments:
        filething (filething)

    Attributes:
        info (`OggOpusInfo`)
        tags (`mutagen._vorbis.VCommentDict`)

    z	audio/oggzaudio/ogg; codecs=opusNc                 .    |j                  d      d|v z  S )Ns   OggSr   )r#   )filenamer+   headers      r   scorezOggOpus.score   s    !!'*kV.CDEr   )r   r   r   r=   r   _Infor?   _Tagsr   _Error_mimesrG   tagsstaticmethodrl   r   r   r   r   r      sA     EEF34FDDF Fr   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   r+   rZ   r   )	filethingts     r   r   r      s.     		A1HHYr   )r=   __all__r&   ior   mutagenr   mutagen._utilr   r	   r
   mutagen._tagsr   mutagen._vorbisr   mutagen.oggr   r   r   OggErrorr   r   r?   r   r   IOErrorr   r   r   r   <module>r      s    (    ; ; % ( ? ?	H 		 	)9* )9X77l 77tFk F6  w	& ' r   