101 lines
3.3 KiB
Python
101 lines
3.3 KiB
Python
#!/usr/bin/python3
|
|
|
|
import os
|
|
from typing import List, Union
|
|
from deezspot.libutils.utils import sanitize_name
|
|
from deezspot.libutils.logging_utils import logger
|
|
from deezspot.models.download import Track
|
|
|
|
|
|
def create_m3u_file(output_dir: str, playlist_name: str) -> str:
|
|
"""
|
|
Creates an m3u playlist file with the proper header.
|
|
|
|
Args:
|
|
output_dir: Base output directory
|
|
playlist_name: Name of the playlist (will be sanitized)
|
|
|
|
Returns:
|
|
str: Full path to the created m3u file
|
|
"""
|
|
playlist_m3u_dir = os.path.join(output_dir, "playlists")
|
|
os.makedirs(playlist_m3u_dir, exist_ok=True)
|
|
|
|
playlist_name_sanitized = sanitize_name(playlist_name)
|
|
m3u_path = os.path.join(playlist_m3u_dir, f"{playlist_name_sanitized}.m3u")
|
|
|
|
if not os.path.exists(m3u_path):
|
|
with open(m3u_path, "w", encoding="utf-8") as m3u_file:
|
|
m3u_file.write("#EXTM3U\n")
|
|
logger.debug(f"Created m3u playlist file: {m3u_path}")
|
|
|
|
return m3u_path
|
|
|
|
|
|
def append_track_to_m3u(m3u_path: str, track_path: str) -> None:
|
|
"""
|
|
Appends a single track path to an existing m3u file.
|
|
|
|
Args:
|
|
m3u_path: Full path to the m3u file
|
|
track_path: Full path to the track file
|
|
"""
|
|
if not track_path or not os.path.exists(track_path):
|
|
return
|
|
|
|
playlist_m3u_dir = os.path.dirname(m3u_path)
|
|
relative_path = os.path.relpath(track_path, start=playlist_m3u_dir)
|
|
|
|
with open(m3u_path, "a", encoding="utf-8") as m3u_file:
|
|
m3u_file.write(f"{relative_path}\n")
|
|
|
|
|
|
def write_tracks_to_m3u(output_dir: str, playlist_name: str, tracks: List[Track]) -> str:
|
|
"""
|
|
Creates an m3u file and writes all successful tracks to it at once.
|
|
|
|
Args:
|
|
output_dir: Base output directory
|
|
playlist_name: Name of the playlist (will be sanitized)
|
|
tracks: List of Track objects
|
|
|
|
Returns:
|
|
str: Full path to the created m3u file
|
|
"""
|
|
playlist_m3u_dir = os.path.join(output_dir, "playlists")
|
|
os.makedirs(playlist_m3u_dir, exist_ok=True)
|
|
|
|
playlist_name_sanitized = sanitize_name(playlist_name)
|
|
m3u_path = os.path.join(playlist_m3u_dir, f"{playlist_name_sanitized}.m3u")
|
|
|
|
with open(m3u_path, "w", encoding="utf-8") as m3u_file:
|
|
m3u_file.write("#EXTM3U\n")
|
|
|
|
for track in tracks:
|
|
if (isinstance(track, Track) and
|
|
track.success and
|
|
hasattr(track, 'song_path') and
|
|
track.song_path and
|
|
os.path.exists(track.song_path)):
|
|
|
|
relative_song_path = os.path.relpath(track.song_path, start=playlist_m3u_dir)
|
|
m3u_file.write(f"{relative_song_path}\n")
|
|
|
|
logger.info(f"Created m3u playlist file at: {m3u_path}")
|
|
return m3u_path
|
|
|
|
|
|
def get_m3u_path(output_dir: str, playlist_name: str) -> str:
|
|
"""
|
|
Get the expected path for an m3u file without creating it.
|
|
|
|
Args:
|
|
output_dir: Base output directory
|
|
playlist_name: Name of the playlist (will be sanitized)
|
|
|
|
Returns:
|
|
str: Full path where the m3u file would be located
|
|
"""
|
|
playlist_m3u_dir = os.path.join(output_dir, "playlists")
|
|
playlist_name_sanitized = sanitize_name(playlist_name)
|
|
return os.path.join(playlist_m3u_dir, f"{playlist_name_sanitized}.m3u") |