diff --git a/CHANGELOG.md b/CHANGELOG.md index 6189727d8..372675fc7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,9 @@ at anytime. ### Changed * Change `max_key_fee` setting to be a dictionary with values for `currency` and `amount` + * Linux default downloads folder changed from `~/Downloads` to `XDG_DOWNLOAD_DIR` + * Linux folders moved from the home directory to `~/.local/share/lbry` + * Windows folders moved from `%APPDATA%/Roaming` to `%APPDATA%/Local/lbry` * Renamed `lbrynet.lbryfile` to `lbrynet.lbry_file` * Renamed `lbrynet.lbryfilemanager` to `lbrynet.file_manager` * Renamed `lbrynet.lbrynet_daemon` to `lbrynet.daemon` @@ -27,6 +30,7 @@ at anytime. * Fixed some log messages throwing exceptions * Fix shutdown of the blob tracker by Session * Fixed claim_new_support docstrings + * Fix default directories to comply to XDG * Fixed BlobManager causing functional tests to fail, removed its unneeded manage() loop * Increased max_key_fee diff --git a/lbrynet/conf.py b/lbrynet/conf.py index 6a960d11f..14692af74 100644 --- a/lbrynet/conf.py +++ b/lbrynet/conf.py @@ -2,10 +2,11 @@ import base58 import json import logging import os +import re import sys import yaml import envparse -from appdirs import user_data_dir +from appdirs import user_data_dir, user_config_dir from lbrynet.core import utils log = logging.getLogger(__name__) @@ -43,25 +44,48 @@ settings_encoders = { '.yml': yaml.safe_dump } -if sys.platform.startswith('darwin'): +if 'darwin' in sys.platform: platform = DARWIN - default_download_directory = os.path.join(os.path.expanduser('~'), 'Downloads') + default_download_dir = os.path.expanduser('~/Downloads') default_data_dir = user_data_dir('LBRY') - default_lbryum_dir = os.path.join(os.path.expanduser('~'), '.lbryum') -elif sys.platform.startswith('win'): + default_lbryum_dir = os.path.expanduser('~/.lbryum') +elif 'nt' in sys.platform: platform = WINDOWS from lbrynet.winhelpers.knownpaths import get_path, FOLDERID, UserHandle - default_download_directory = get_path(FOLDERID.Downloads, UserHandle.current) - default_data_dir = os.path.join( - get_path(FOLDERID.RoamingAppData, UserHandle.current), 'lbrynet') - default_lbryum_dir = os.path.join( - get_path(FOLDERID.RoamingAppData, UserHandle.current), 'lbryum') + default_download_dir = get_path(FOLDERID.Downloads, UserHandle.current) + + # This checks whether the folders are still in their old locations + if os.path.isdir(user_data_dir('lbryum', roaming=True)) and \ + os.path.isdir(user_data_dir('lbrynet', roaming=True)): + default_data_dir = user_data_dir('lbrynet', roaming=True) + default_lbryum_dir = user_data_dir('lbryum', roaming=True) + else: + default_data_dir = user_data_dir('lbrynet', 'lbry') + default_lbryum_dir = user_data_dir('lbryum', 'lbry') else: platform = LINUX - default_download_directory = os.path.join(os.path.expanduser('~'), 'Downloads') - default_data_dir = os.path.join(os.path.expanduser('~'), '.lbrynet') - default_lbryum_dir = os.path.join(os.path.expanduser('~'), '.lbryum') + + # This checks whether the folders are still in their old locations + if os.path.isdir(os.path.expanduser('~/.lbrynet')) and \ + os.path.isdir(os.path.expanduser('~/.lbryum')): + default_data_dir = os.path.expanduser('~/.lbrynet') + default_lbryum_dir = os.path.expanduser('~/.lbryum') + default_download_dir = os.path.expanduser('~/Downloads') + else: + default_data_dir = user_data_dir('lbry/lbrynet') + default_lbryum_dir = user_data_dir('lbry/lbryum') + try: + with open(os.path.join(user_config_dir(), 'user-dirs.dirs'), 'r') as xdg: + down_dir = re.search(r'XDG_DOWNLOAD_DIR=(.+)', xdg.read()).group(1) + down_dir = re.sub('\$HOME', os.getenv('HOME'), down_dir) + default_download_dir = re.sub('\"', '', down_dir) + except EnvironmentError: + default_download_dir = os.getenv('XDG_DOWNLOAD_DIR') + + if not default_download_dir: + default_download_dir = os.path.expanduser('~/Downloads') + ICON_PATH = 'icons' if platform is WINDOWS else 'app.icns' @@ -159,7 +183,7 @@ ADJUSTABLE_SETTINGS = { 'data_rate': (float, .0001), # points/megabyte 'delete_blobs_on_remove': (bool, True), 'dht_node_port': (int, 4444), - 'download_directory': (str, default_download_directory), + 'download_directory': (str, default_download_dir), 'download_timeout': (int, 180), 'is_generous_host': (bool, True), 'known_dht_nodes': (list, DEFAULT_DHT_NODES, server_port), diff --git a/lbrynet/daemon/Downloader.py b/lbrynet/daemon/Downloader.py index a72f01423..e6118407a 100644 --- a/lbrynet/daemon/Downloader.py +++ b/lbrynet/daemon/Downloader.py @@ -64,7 +64,6 @@ class GetStream(object): # fired after the metadata and the first data blob have been downloaded self.data_downloading_deferred = defer.Deferred(None) - @property def download_path(self): return os.path.join(self.download_directory, self.downloader.file_name) @@ -215,7 +214,6 @@ class GetStream(object): safe_stop(self.checker) raise - try: yield self.data_downloading_deferred except Exception as err: @@ -224,4 +222,3 @@ class GetStream(object): raise defer.returnValue((self.downloader, self.finished_deferred)) - diff --git a/lbrynet/daemon/FileStreamer.py b/lbrynet/daemon/FileStreamer.py index 4f8c4db94..bff4926ad 100644 --- a/lbrynet/daemon/FileStreamer.py +++ b/lbrynet/daemon/FileStreamer.py @@ -1,24 +1,14 @@ import logging -import os -import sys import mimetypes -from appdirs import user_data_dir from zope.interface import implements from twisted.internet import defer, error, interfaces, abstract, task, reactor -# TODO: omg, this code is essentially duplicated in Daemon -if sys.platform != "darwin": - data_dir = os.path.join(os.path.expanduser("~"), ".lbrynet") -else: - data_dir = user_data_dir("LBRY") -if not os.path.isdir(data_dir): - os.mkdir(data_dir) - log = logging.getLogger(__name__) STATUS_FINISHED = 'finished' + class EncryptedFileStreamer(object): """ Writes LBRY stream to request; will pause to wait for new data if the file @@ -31,7 +21,6 @@ class EncryptedFileStreamer(object): bufferSize = abstract.FileDescriptor.bufferSize - # How long to wait between sending blocks (needed because some # video players freeze up if you try to send data too fast) stream_interval = 0.005 @@ -39,7 +28,6 @@ class EncryptedFileStreamer(object): # How long to wait before checking if new data has been appended to the file new_data_check_interval = 0.25 - def __init__(self, request, path, stream, file_manager): def _set_content_length_header(length): self._request.setHeader('content-length', length) diff --git a/lbrynet/daemon/Resources.py b/lbrynet/daemon/Resources.py index 9abe612b5..65ebf13af 100644 --- a/lbrynet/daemon/Resources.py +++ b/lbrynet/daemon/Resources.py @@ -2,25 +2,15 @@ import logging import os import shutil import json -import sys import tempfile -from appdirs import user_data_dir from twisted.web import server, static, resource from twisted.internet import defer, error from lbrynet import conf from lbrynet.daemon.FileStreamer import EncryptedFileStreamer -# TODO: omg, this code is essentially duplicated in Daemon - -if sys.platform != "darwin": - data_dir = os.path.join(os.path.expanduser("~"), ".lbrynet") -else: - data_dir = user_data_dir("LBRY") -if not os.path.isdir(data_dir): - os.mkdir(data_dir) log = logging.getLogger(__name__) diff --git a/lbrynet/daemon/daemon_scripts/Autofetcher.py b/lbrynet/daemon/daemon_scripts/Autofetcher.py index fc73373f2..1cba26d3c 100644 --- a/lbrynet/daemon/daemon_scripts/Autofetcher.py +++ b/lbrynet/daemon/daemon_scripts/Autofetcher.py @@ -1,21 +1,14 @@ import json import logging.handlers -import sys import os -from appdirs import user_data_dir from twisted.internet.task import LoopingCall from twisted.internet import reactor +from lbrynet import conf -if sys.platform != "darwin": - log_dir = os.path.join(os.path.expanduser("~"), ".lbrynet") -else: - log_dir = user_data_dir("LBRY") - -if not os.path.isdir(log_dir): - os.mkdir(log_dir) - +conf.initialize_settings() +log_dir = conf.settings['data_dir'] LOG_FILENAME = os.path.join(log_dir, 'lbrynet-daemon.log') if os.path.isfile(LOG_FILENAME):