From 73c75c6598436424bd85b2816b2a6393a1d4f317 Mon Sep 17 00:00:00 2001 From: Hellow Date: Thu, 13 Apr 2023 19:09:41 +0200 Subject: [PATCH] polished finding music directory to follow the freedesktop standard --- .../utils/path_manager/music_directory.py | 45 ++++++++++++------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/src/music_kraken/utils/path_manager/music_directory.py b/src/music_kraken/utils/path_manager/music_directory.py index 0e32a43..0a0ea72 100644 --- a/src/music_kraken/utils/path_manager/music_directory.py +++ b/src/music_kraken/utils/path_manager/music_directory.py @@ -1,4 +1,7 @@ +import os from pathlib import Path +from typing import Optional + from sys import platform import logging from os.path import expandvars @@ -14,27 +17,37 @@ def get_xdg_music_directory() -> Path: Thanks to Distant Thunder, as well as Kevin Gruber for making that pull request: https://github.com/HeIIow2/music-downloader/pull/6 - :return: + XDG_USER_DIRS_FILE reference: + https://freedesktop.org/wiki/Software/xdg-user-dirs/ + https://web.archive.org/web/20230322012953/https://freedesktop.org/wiki/Software/xdg-user-dirs/ """ - # XDG_USER_DIRS_FILE reference: https://freedesktop.org/wiki/Software/xdg-user-dirs/ - xdg_user_dirs_file = Path(Path.home(), ".config", "user-dirs.dirs") + xdg_user_dirs_file = os.environ.get("XDG_CONFIG_HOME") or Path(Path.home(), ".config", "user-dirs.dirs") + xdg_user_dirs_default_file = Path("/etc/xdg/user-dirs.defaults") - try: - with open(xdg_user_dirs_file, 'r') as f: - data = "[XDG_USER_DIRS]\n" + f.read() - config = configparser.ConfigParser(allow_no_value=True) - config.read_string(data) - xdg_config = config['XDG_USER_DIRS'] - return Path(expandvars(xdg_config['xdg_music_dir'].strip('"'))) + def get_music_dir_from_xdg_file(xdg_file_path: os.PathLike) -> Optional[Path]: + try: + with open(xdg_file_path, 'r') as f: + data = "[XDG_USER_DIRS]\n" + f.read() + config = configparser.ConfigParser(allow_no_value=True) + config.read_string(data) + xdg_config = config['XDG_USER_DIRS'] + return Path(expandvars(xdg_config['xdg_music_dir'].strip('"'))) - except (FileNotFoundError, KeyError) as e: - logging.warning( - f"Missing file or No entry found for \"xdg_music_dir\" in: \"{xdg_user_dirs_file}\".\n" - f"Will fallback on default \"$HOME/Music\"." - ) - logging.debug(str(e)) + except (FileNotFoundError, KeyError) as e: + logging.warning( + f"Missing file or No entry found for \"xdg_music_dir\" in: \"{xdg_file_path}\".\n" + ) + logging.debug(str(e)) + music_dir = get_music_dir_from_xdg_file(xdg_user_dirs_file) + if music_dir is not None: + return music_dir + music_dir = get_music_dir_from_xdg_file(xdg_user_dirs_default_file) + if music_dir is not None: + return music_dir + + logging.warning(f"couldn't find a XDG music dir, falling back to: {DEFAULT_MUSIC_DIRECTORY}") return DEFAULT_MUSIC_DIRECTORY