diff --git a/SpotifyAudioRecorder.py b/SpotifyAudioRecorder.py index 0cb32464d8d4fe63f36238b7f9efeced03c4e3b0..785ae352a7a580082178424d3d2f9c3122e5b962 100644 --- a/SpotifyAudioRecorder.py +++ b/SpotifyAudioRecorder.py @@ -1,6 +1,6 @@ -import threading import time import wave +from contextlib import contextmanager import pyaudiowpatch as pyaudio from TheCodeLabs_BaseUtils.DefaultLogger import DefaultLogger @@ -9,14 +9,12 @@ LOG_FORMAT = '[%(levelname)-7s] - %(asctime)s - %(message)s' LOGGER = DefaultLogger().create_logger_if_not_exists('SpotifyAudioRecorder', logFormat=LOG_FORMAT) -class SpotifyAudioRecorder(threading.Thread): +class SpotifyAudioRecorder: _CHUNK_SIZE = 512 def __init__(self, deviceName: str, destinationFilePath: str): - threading.Thread.__init__(self, daemon=True) self._deviceName = deviceName self._destinationFilePath = destinationFilePath - self._stopEvent = threading.Event() def __get_device_by_name(self, pyaudioInstance, deviceName: str): deviceNames = [] @@ -31,7 +29,8 @@ class SpotifyAudioRecorder(threading.Thread): message += f'\n\t{deviceName}' raise RuntimeError(message) - def run(self): + @contextmanager + def record(self): with pyaudio.PyAudio() as pyaudioInstance: device = self.__get_device_by_name(pyaudioInstance, self._deviceName) LOGGER.info(f'Recording from: ({device["index"]}) {device["name"]}') @@ -52,27 +51,18 @@ class SpotifyAudioRecorder(threading.Thread): input=True, input_device_index=device['index'], stream_callback=callback - ): - while not self._stopEvent.is_set(): - time.sleep(1) + ) as stream: + yield stream waveFile.close() LOGGER.info(f'Recording stopped. File: "{self._destinationFilePath}"') - def stop(self): - if not self._stopEvent.is_set(): - self._stopEvent.set() - - def is_stopped(self) -> bool: - return self._stopEvent.is_set() - if __name__ == '__main__': recorder = SpotifyAudioRecorder( deviceName='3/4 - Musik (2- GIGAPort HD Audio driver) [Loopback]', destinationFilePath='C:/Users/RobertG/Desktop/output.wav' ) - recorder.start() - time.sleep(5) - recorder.stop() + with recorder.record() as stream: + time.sleep(5) diff --git a/SpotifyRecorder.py b/SpotifyRecorder.py index 75aba3b83efbf9ec9a0028bfea37a8e85bf6c59b..03c6b83e759384ac0726e7e36f48457659e4a3b2 100644 --- a/SpotifyRecorder.py +++ b/SpotifyRecorder.py @@ -99,24 +99,18 @@ class SpotifyRecorder: continue LOGGER.info(f'Recording track {index + 1}/{len(tracks)}: "{track["track"]["name"]}"...') - recorder = None try: filePath = self.__determine_file_path(index + 1, track) recorder = SpotifyAudioRecorder(self._audioDeviceName, filePath) - recorder.start() - - self.__play_track(deviceId, track['track']['uri']) - self.__wait_for_track_playing() - self.__wait_for_track_end(track) - - recorder.stop() + with recorder.record(): + self.__play_track(deviceId, track['track']['uri']) + self.__wait_for_track_playing() + self.__wait_for_track_end(track) recordedTracks.append(track['track']['name']) except Exception as e: LOGGER.error(f'An error occurred while recording track "{track["track"]["name"]}"', exc_info=e) errorTracks.append(track['track']['name']) - if recorder is not None and not recorder.is_stopped(): - recorder.stop() LOGGER.info('### DONE ###') LOGGER.info(f'{len(tracks)} tracks, {len(recordedTracks)} recorded, {len(skippedTracks)} skipped, {len(errorTracks)} errors')