def save(query: List[str], save_path: str, downloader, m3u_file: Optional[str]=None) -> None:
    '\n    Save metadata from spotify to the disk.\n\n    ### Arguments\n    - query: list of strings to search for.\n    - save_path: Path to the file to save the metadata to.\n    - threads: Number of threads to use.\n\n    ### Notes\n    - This function is multi-threaded.\n    '
    songs = parse_query(query, downloader.threads)
    save_data = [song.json for song in songs]
    with open(save_path, 'w', encoding='utf-8') as save_file:
        json.dump(save_data, save_file, indent=4, ensure_ascii=False)
    if m3u_file:
        create_m3u_file(m3u_file, songs, downloader.output, downloader.output_format, False)
    downloader.progress_handler.log(f"Saved {len(save_data)} song{('s' if (len(save_data) > 1) else '')} to {save_path}")
Save metadata from spotify to the disk.

### Arguments
- query: list of strings to search for.
- save_path: Path to the file to save the metadata to.
- threads: Number of threads to use.

### Notes
- This function is multi-threaded.
def save(query: List[str], save_path: str, downloader, m3u_file: Optional[str]=None) -> None:
    '\n    Save metadata from spotify to the disk.\n\n    ### Arguments\n    - query: list of strings to search for.\n    - save_path: Path to the file to save the metadata to.\n    - threads: Number of threads to use.\n\n    ### Notes\n    - This function is multi-threaded.\n    '
    songs = parse_query(query, downloader.threads)
    save_data = [song.json for song in songs]
    with open(save_path, 'w', encoding='utf-8') as save_file:
        json.dump(save_data, save_file, indent=4, ensure_ascii=False)
    if m3u_file:
        create_m3u_file(m3u_file, songs, downloader.output, downloader.output_format, False)
    downloader.progress_handler.log(f"Saved {len(save_data)} song{('s' if (len(save_data) > 1) else )} to {save_path}")