2023-10-23 15:49:26 +00:00
|
|
|
from collections import defaultdict
|
|
|
|
import os
|
|
|
|
|
|
|
|
from typing import DefaultDict, Dict, List
|
|
|
|
|
2023-12-18 18:33:58 +00:00
|
|
|
from pydub import AudioSegment
|
|
|
|
import io
|
|
|
|
|
2023-10-23 15:49:26 +00:00
|
|
|
|
|
|
|
def tree() -> DefaultDict:
|
|
|
|
return defaultdict(tree)
|
|
|
|
|
|
|
|
|
|
|
|
def get_last_segment(path: str) -> str:
|
|
|
|
if path[-1] == '/':
|
|
|
|
path = path[:-1]
|
|
|
|
return path.split(os.sep)[-1]
|
|
|
|
|
|
|
|
|
|
|
|
FILES_KEY = '_i_files'
|
|
|
|
|
|
|
|
|
|
|
|
def build_file_tree(root_dir: str) -> DefaultDict:
|
|
|
|
file_tree = tree()
|
|
|
|
root_dir = os.path.normpath(root_dir) # Normalize the path
|
|
|
|
|
|
|
|
for dirpath, dirnames, files in os.walk(root_dir):
|
|
|
|
# Get the subdirectory path relative to the root directory
|
|
|
|
subdir = os.path.relpath(dirpath, root_dir)
|
|
|
|
|
|
|
|
# Split the path into components to navigate the nested dictionary
|
|
|
|
path_components = subdir.split(os.sep)
|
|
|
|
|
|
|
|
# Navigate to the current subdirectory in the file tree
|
|
|
|
current_subdir = file_tree
|
|
|
|
for component in path_components:
|
|
|
|
current_subdir = current_subdir[component]
|
|
|
|
|
|
|
|
# Add files to the current subdirectory in the file tree
|
|
|
|
current_subdir[FILES_KEY] = files
|
|
|
|
|
|
|
|
return file_tree
|
|
|
|
|
|
|
|
|
|
|
|
# Function to convert defaultdict to dict (for readability)
|
|
|
|
def defaultdict_to_dict(d: defaultdict) -> dict:
|
|
|
|
if isinstance(d, defaultdict):
|
|
|
|
d = {k: defaultdict_to_dict(v) for k, v in d.items()}
|
|
|
|
return d
|
2023-12-18 18:33:58 +00:00
|
|
|
|
|
|
|
|
|
|
|
def convert_to_mp3(audio_data: bytes, sample_width: int, frame_rate: int, channels: int) -> bytes:
|
|
|
|
audio = AudioSegment.from_raw(
|
|
|
|
io.BytesIO(audio_data),
|
|
|
|
sample_width=sample_width,
|
|
|
|
frame_rate=frame_rate,
|
|
|
|
channels=channels
|
|
|
|
)
|
|
|
|
mp3_buffer = io.BytesIO()
|
|
|
|
audio.export(mp3_buffer, format="mp3")
|
|
|
|
return mp3_buffer.getvalue()
|