linux/storagepath: Revamp handling of user-dirs
dont assume that ~/.config/user-dirs.dirs exists
don't assume it does have contents or the relevant value
don't use exception handling as happy path control flow
when defaulting, use the path under HOME, not e.g. /Pictures
@@ -4,35 +4,36 @@ Linux Storage Path
'''
from plyer.facades import StoragePath
-from os.path import expanduser, dirname, abspath
+from os.path import expanduser, dirname, abspath, join, exists
# Default paths for each name
USER_DIRS = "/.config/user-dirs.dirs"
PATHS = {
- "DESKTOP": "/Desktop",
- "DOCUMENTS": "/Documents",
- "DOWNLOAD": "/Downloads",
- "MUSIC": "/Music",
- "PICTURES": "/Pictures",
- "VIDEOS": "/Videos"
+ "DESKTOP": "Desktop",
+ "DOCUMENTS": "Documents",
+ "DOWNLOAD": "Downloads",
+ "MUSIC": "Music",
+ "PICTURES": "Pictures",
+ "VIDEOS": "Videos"
}
class LinuxStoragePath(StoragePath):
def _get_from_user_dirs(self, name):
- try:
- with open(self._get_home_dir() + USER_DIRS, "r") as f:
- lines = f.readlines()
- # Find the line that starts with XDG_<name> to get the path
- index = [i for i, v in enumerate(lines)
- if v.startswith("XDG_" + name)][0]
- return lines[index].split('"')[1]
- except KeyError:
- return PATHS[name]
- except Exception as e:
- raise e
+ home_dir = self._get_home_dir()
+ default = join(home_dir, PATHS[name])
+ user_dirs = join(home_dir, USER_DIRS)
+ if not exists(user_dirs):
+ return default
+
+ with open(user_dirs, "r") as f:
+ for l in f.readlines():
+ if l.startswith("XDG_" + name):
+ return l.split('"')[1]
+
+ return default
def _get_home_dir(self):
return expanduser('~')
