
    h                     T   d dl Z d dlmZmZmZ ddlmZ  e j        d          Z e j        d          Z	 G d de          Z
	 	 dd	ed
edededee         dee         defdZdee         defdZdd	ed
edededef
dZdededefdZdededefdZdede
fdZddededefdZdS )    N)OptionalSequence
NamedTuple   )
IntOrFloatz*(\d{1,2}):(\d{1,2}):(\d{1,2})[.,](\d{1,3})z(\d{1,2}):(\d{2}):(\d{2})c                   <    e Zd ZU dZeed<   eed<   eed<   eed<   dS )Timesz"Named tuple (h, m, s, ms) of ints.hmsmsN)__name__
__module____qualname____doc__int__annotations__     L/var/www/html/auto_sub_bot/venv/lib/python3.11/site-packages/pysubs2/time.pyr	   r	      s:         ,,
FFF
FFF
FFFGGGGGr   r	   r
   r   r   r   framesfpsreturnc                 t    ||t          | |||          S ||t          ||          S t          d          )au  
    Convert time to milliseconds.

    See :func:`pysubs2.time.times_to_ms()`. When both frames and fps are specified,
    :func:`pysubs2.time.frames_to_ms()` is called instead.

    Raises:
        ValueError: Invalid fps, or one of frames/fps is missing.

    Example:
        >>> make_time(s=1.5)
        1500
        >>> make_time(frames=50, fps=25)
        2000

    Nz%Both fps and frames must be specified)times_to_msframes_to_ms
ValueError)r
   r   r   r   r   r   s         r   	make_timer      sJ    $ ~#+1aB'''		FC(((@AAAr   groupsc                 J   t          |           dk    r9t          t          |           \  }}}}|ddt          | d                   z
  z  z  }n>t          |           dk    rt          t          |           \  }}}d}nt          d          ||dz  z  }||dz  z  }||d	z  z  }|S )
a6  
    Convert groups from :data:`pysubs2.time.TIMESTAMP` or :data:`pysubs2.time.TIMESTAMP_SHORT`
    match to milliseconds.
    
    Example:
        >>> timestamp_to_ms(TIMESTAMP.match("0:00:00.42").groups())
        420
        >>> timestamp_to_ms(TIMESTAMP_SHORT.match("0:00:01").groups())
        1000

       
      r   zUnexpected number of groups  `  6 )lenmapr   r   )r   r
   r   r   fracr   s         r   timestamp_to_msr+   /   s    " 6{{aC((1aBS__,--	V		c6""1a6777!d(NB!e)OB!g+BIr   c                 j    ||dz  z  }||dz  z  }|| dz  z  }t          t          |                    S )z
    Convert hours, minutes, seconds to milliseconds.
    
    Arguments may be positive or negative, int or float,
    need not be normalized (``s=120`` is okay).
    
    Returns:
        Number of milliseconds (rounded to int).
    
    r%   r&   r'   )r   round)r
   r   r   r   s       r   r   r   O   s>     !d(NB!e)OB!g+BuRyy>>r   c                 x    |dk    rt          d| d          t          t          | d|z  z                      S )aH  
    Convert frame-based duration to milliseconds.
    
    Arguments:
        frames: Number of frames (should be int).
        fps: Framerate (must be a positive number, eg. 23.976).
    
    Returns:
        Number of milliseconds (rounded to int).
        
    Raises:
        ValueError: fps was negative or zero.
    
    r   %Framerate must be a positive number ().r%   r   r   r-   )r   r   s     r   r   r   `   sF     axxHHHHIIIuVtcz*++,,,r   c                 x    |dk    rt          d| d          t          t          | dz  |z                      S )aP  
    Convert milliseconds to number of frames.
    
    Arguments:
        ms: Number of milliseconds (may be int, float or other numeric class).
        fps: Framerate (must be a positive number, eg. 23.976).
    
    Returns:
        Number of frames (int).
        
    Raises:
        ValueError: fps was negative or zero.
    
    r   r/   r0   r%   r1   )r   r   s     r   ms_to_framesr3   u   sF     axxHHHHIIIub4i3&''(((r   c                     t          t          |                     } t          | d          \  }} t          | d          \  }} t          | d          \  }} t          ||||           S )aZ  
    Convert milliseconds to normalized tuple (h, m, s, ms).
    
    Arguments:
        ms: Number of milliseconds (may be int, float or other numeric class).
            Should be non-negative.
    
    Returns:
        Named tuple (h, m, s, ms) of ints.
        Invariants: ``ms in range(1000) and s in range(60) and m in range(60)``
    
    r'   r&   r%   )r   r-   divmodr	   )r   r
   r   r   s       r   ms_to_timesr6      sb     
U2YYB2wEAr2uEAr2tEArAq"r   F	fractionsc           	          | dk     rdnd}t          t          |                     \  }}}} |r| |dd|dd|dd| dS | |dd|dd|dS )	a  
    Prettyprint milliseconds to [-]H:MM:SS[.mmm]
    
    Handles huge and/or negative times. Non-negative times with ``fractions=True``
    are matched by :data:`pysubs2.time.TIMESTAMP`.
    
    Arguments:
        ms: Number of milliseconds (int, float or other numeric class).
        fractions: Whether to print up to millisecond precision.
    
    Returns:
        str
    
    r   - 01d:02d.03d)r6   abs)r   r7   sgnr
   r   r   s         r   	ms_to_strrB      s     a##RCc"gg&&KAq!R /7q777q777q777r7777.q...q...q....r   )r   r   r   r   NN)r   r   r   r   )F)retypingr   r   r   commonr   compile	TIMESTAMPTIMESTAMP_SHORTr	   r   floatr   strr+   r   r   r3   r6   boolrB   r   r   r   <module>rL      s   				 1 1 1 1 1 1 1 1 1 1       BJDEE	 "*9::    J    YZCGB B BJ Bz B: BsmB19%BLOB B B B4HSM c    @ : j  Z `c    "- -5 -S - - - -*)Z )e ) ) ) ) )*J 5    (/ /* / /# / / / / / /r   