11from numpy import ndarray
22from soundfile import SoundFile
3- from typing_extensions import Optional
3+ from typing_extensions import Optional , Self
44from .._types import AudioSamplerate , AudioChannels , AudioSubType , AudioFormat , AudioEndians , AudioDType
55from ..base import AudioSourceBase
66from ..functions import get_mutagen_info , get_audio_metadata
77from .urlio import URLIO
88
99# ! URL Audio Source Class
1010class URLAudioSource (AudioSourceBase ):
11+ """A class for reading an audio stream in array format by direct/indirect reference."""
1112 __repr_attrs__ = ('name' , ('metadata' , True ), 'samplerate' , 'channels' , 'subtype' , 'endian' , 'format' , 'bitrate' )
1213
1314 def __init__ (
@@ -26,36 +27,60 @@ def __init__(
2627 self .sfio = SoundFile (self .urlio , 'r' , samplerate , channels , subtype , endian , format , closefd = closefd )
2728 self .minfo = get_mutagen_info (self .name )
2829 self .metadata = get_audio_metadata (self .sfio , self .minfo )
30+ self .closefd = closefd
31+
32+ # ^ Dander Methods
33+
34+ def __del__ (self ) -> None :
35+ if self .closefd and (not self .closed ):
36+ self .close ()
37+
38+ def __enter__ (self ) -> Self :
39+ return self
40+
41+ def __exit__ (self , * args : object ) -> None :
42+ if self .closefd and (not self .closed ):
43+ self .close ()
2944
3045 # ^ Propertyes
3146
3247 @property
3348 def samplerate (self ) -> AudioSamplerate :
49+ """The sampling rate of the audio source."""
3450 return self .sfio .samplerate
3551
3652 @property
3753 def channels (self ) -> AudioChannels :
54+ """The number of channels of the audio source."""
3855 return self .sfio .channels
3956
4057 @property
4158 def subtype (self ) -> AudioSubType :
59+ """The type of audio stream packaging."""
4260 return self .sfio .subtype
4361
4462 @property
4563 def endian (self ) -> AudioEndians :
64+ """The type of byte sequence."""
4665 return self .sfio .endian
4766
4867 @property
4968 def format (self ) -> AudioFormat :
69+ """Audio format for storing an audio stream."""
5070 return self .sfio .format
5171
5272 @property
5373 def bitrate (self ) -> Optional [int ]:
54- try : return self .minfo .info .bitrate
55- except : return None
74+ """The speed of the audio stream in the format of bits per second."""
75+ try :
76+ if self .minfo .info .bitrate is not None :
77+ return self .minfo .info .bitrate
78+ except :
79+ pass
5680
5781 @property
5882 def closed (self ) -> bool :
83+ """Whether the IO will be closed after the context manager is closed."""
5984 return self .sfio .closed
6085
6186 # ^ IO Check Methods
@@ -126,4 +151,5 @@ def tell(self) -> int:
126151
127152 def close (self ) -> None :
128153 """Close the file. Can be called multiple times."""
129- return self .sfio .close ()
154+ self .urlio .close ()
155+ self .sfio .close ()
0 commit comments