Files
DemonEditor/app/settings.py

856 lines
26 KiB
Python
Raw Normal View History

2021-08-30 15:04:15 +03:00
# -*- coding: utf-8 -*-
#
# The MIT License (MIT)
#
2022-01-05 00:41:06 +03:00
# Copyright (c) 2018-2022 Dmitriy Yefremov
2021-08-30 15:04:15 +03:00
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
# Author: Dmitriy Yefremov
#
import copy
2019-12-13 13:31:07 +03:00
import json
2020-01-02 15:47:48 +03:00
import locale
2019-12-13 13:31:07 +03:00
import os
2020-03-22 14:13:01 +03:00
import sys
2019-12-22 20:42:29 +03:00
from enum import Enum, IntEnum
2020-04-13 13:46:02 +03:00
from functools import lru_cache
2019-12-13 13:31:07 +03:00
from pathlib import Path
from pprint import pformat
from textwrap import dedent
2019-12-13 13:31:07 +03:00
2021-08-23 16:19:46 +03:00
SEP = os.sep
2020-02-12 13:51:40 +03:00
HOME_PATH = str(Path.home())
2021-08-23 16:19:46 +03:00
CONFIG_PATH = HOME_PATH + "{}.config{}demon-editor{}".format(SEP, SEP, SEP)
2019-12-13 13:31:07 +03:00
CONFIG_FILE = CONFIG_PATH + "config.json"
2021-08-30 15:04:15 +03:00
DATA_PATH = HOME_PATH + "{}DemonEditor{}".format(SEP, SEP)
2021-08-17 11:00:13 +03:00
GTK_PATH = os.environ.get("GTK_PATH", None)
2019-12-13 13:31:07 +03:00
2020-03-22 14:13:01 +03:00
IS_DARWIN = sys.platform == "darwin"
2021-08-17 11:00:13 +03:00
IS_WIN = sys.platform == "win32"
IS_LINUX = sys.platform == "linux"
2020-03-22 14:13:01 +03:00
2019-12-13 13:31:07 +03:00
2019-12-22 20:42:29 +03:00
class Defaults(Enum):
""" Default program settings """
2021-08-30 15:04:15 +03:00
USER = "root"
PASSWORD = ""
HOST = "127.0.0.1"
FTP_PORT = "21"
HTTP_PORT = "80"
TELNET_PORT = "23"
HTTP_USE_SSL = False
# Enigma2.
BOX_SERVICES_PATH = "/etc/enigma2/"
BOX_SATELLITE_PATH = "/etc/tuxbox/"
BOX_PICON_PATH = "/usr/share/enigma2/picon/"
BOX_PICON_PATHS = ("/usr/share/enigma2/picon/",
"/media/hdd/picon/",
"/media/usb/picon/",
"/media/mmc/picon/",
"/media/cf/picon/")
# Neutrino.
NEUTRINO_BOX_SERVICES_PATH = "/var/tuxbox/config/zapit/"
NEUTRINO_BOX_SATELLITE_PATH = "/var/tuxbox/config/"
NEUTRINO_BOX_PICON_PATH = "/usr/share/tuxbox/neutrino/icons/logo/"
NEUTRINO_BOX_PICON_PATHS = ("/usr/share/tuxbox/neutrino/icons/logo/",)
# Paths.
BACKUP_PATH = "{}backup{}".format(DATA_PATH, SEP)
PICON_PATH = "{}picons{}".format(DATA_PATH, SEP)
2019-12-22 20:42:29 +03:00
DEFAULT_PROFILE = "default"
BACKUP_BEFORE_DOWNLOADING = True
BACKUP_BEFORE_SAVE = True
V5_SUPPORT = False
2020-04-16 11:55:48 +03:00
FORCE_BQ_NAMES = False
2021-08-23 16:19:46 +03:00
HTTP_API_SUPPORT = True
2019-12-22 20:42:29 +03:00
ENABLE_YT_DL = False
ENABLE_SEND_TO = False
USE_COLORS = True
NEW_COLOR = "rgb(255,230,204)"
EXTRA_COLOR = "rgb(179,230,204)"
TOOLTIP_LOGO_SIZE = 96
LIST_PICON_SIZE = 32
2019-12-22 20:42:29 +03:00
FAV_CLICK_MODE = 0
2020-03-22 14:13:01 +03:00
PLAY_STREAMS_MODE = 1 if IS_DARWIN else 0
2021-08-23 16:19:46 +03:00
STREAM_LIB = "mpv" if IS_WIN else "vlc"
2022-03-10 23:06:06 +03:00
MAIN_LIST_PLAYBACK = False
2020-03-06 11:55:34 +03:00
PROFILE_FOLDER_DEFAULT = False
2021-08-23 16:19:46 +03:00
RECORDS_PATH = DATA_PATH + "records{}".format(SEP)
2020-03-09 14:53:03 +03:00
ACTIVATE_TRANSCODING = False
2021-08-23 16:19:46 +03:00
ACTIVE_TRANSCODING_PRESET = "720p TV{}device".format(SEP)
2019-12-22 20:42:29 +03:00
class SettingsType(IntEnum):
2019-12-13 13:31:07 +03:00
""" Profiles for settings """
2019-12-22 20:42:29 +03:00
ENIGMA_2 = 0
NEUTRINO_MP = 1
def get_default_settings(self):
2021-08-30 15:04:15 +03:00
""" Returns default settings for current type. """
2019-12-22 20:42:29 +03:00
if self is self.ENIGMA_2:
2021-08-30 15:04:15 +03:00
srv_path = Defaults.BOX_SERVICES_PATH.value
sat_path = Defaults.BOX_SATELLITE_PATH.value
picons_path = Defaults.BOX_PICON_PATH.value
http_timeout = 5
telnet_timeout = 5
else:
srv_path = Defaults.NEUTRINO_BOX_SERVICES_PATH.value
sat_path = Defaults.NEUTRINO_BOX_SATELLITE_PATH.value
picons_path = Defaults.NEUTRINO_BOX_PICON_PATH.value
http_timeout = 2
telnet_timeout = 1
return {"setting_type": self.value,
"host": Defaults.HOST.value,
"port": Defaults.FTP_PORT.value,
"timeout": 5,
"user": Defaults.USER.value,
"password": Defaults.PASSWORD.value,
"http_port": Defaults.HTTP_PORT.value,
"http_timeout": http_timeout,
"http_use_ssl": Defaults.HTTP_USE_SSL.value,
"telnet_port": Defaults.TELNET_PORT.value,
"telnet_timeout": telnet_timeout,
"services_path": srv_path,
"user_bouquet_path": srv_path,
"satellites_xml_path": sat_path,
"picons_path": picons_path}
2019-12-22 20:42:29 +03:00
class SettingsException(Exception):
pass
2019-12-13 13:31:07 +03:00
2020-05-29 13:24:55 +03:00
class SettingsReadException(SettingsException):
pass
2020-03-22 14:13:01 +03:00
class PlayStreamsMode(IntEnum):
""" Behavior mode when opening streams. """
BUILT_IN = 0
2021-02-08 13:08:28 +03:00
WINDOW = 1
2020-03-22 14:13:01 +03:00
M3U = 2
2019-12-13 13:31:07 +03:00
class Settings:
__INSTANCE = None
2021-08-30 15:04:15 +03:00
__VERSION = 2
2019-12-13 13:31:07 +03:00
def __init__(self, ext_settings=None):
2020-05-29 13:24:55 +03:00
try:
2021-08-30 15:04:15 +03:00
settings = ext_settings or self.get_settings()
2020-05-29 13:24:55 +03:00
except PermissionError as e:
raise SettingsReadException(e)
2019-12-22 20:42:29 +03:00
if self.__VERSION > settings.get("version", 0):
raise SettingsException("Outdated version of the settings format!")
self._settings = settings
self._current_profile = self._settings.get("default_profile", "default")
self._profiles = self._settings.get("profiles", {"default": SettingsType.ENIGMA_2.get_default_settings()})
2020-02-10 14:45:05 +03:00
self._cp_settings = self._profiles.get(self._current_profile, None) # Current profile settings
if not self._cp_settings:
raise SettingsException("Error reading settings [current profile].")
2019-12-13 13:31:07 +03:00
def __str__(self):
return dedent(""" Current profile: {}
Current profile options:
{}
Full config:
{}
""").format(self._current_profile,
2019-12-22 20:42:29 +03:00
pformat(self._cp_settings),
pformat(self._settings))
2019-12-13 13:31:07 +03:00
@classmethod
def get_instance(cls):
if not cls.__INSTANCE:
cls.__INSTANCE = Settings()
return cls.__INSTANCE
def save(self):
2021-08-30 15:04:15 +03:00
self.write_settings(self._settings)
2019-12-13 13:31:07 +03:00
def reset(self, force_write=False):
2019-12-22 20:42:29 +03:00
for k, v in self.setting_type.get_default_settings().items():
self._cp_settings[k] = v
2020-03-06 11:55:34 +03:00
2019-12-13 13:31:07 +03:00
if force_write:
2019-12-22 20:42:29 +03:00
self.save()
2020-01-02 15:47:48 +03:00
@staticmethod
def reset_to_default():
2021-08-30 15:04:15 +03:00
Settings.write_settings(Settings.get_default_settings())
2020-01-02 15:47:48 +03:00
2019-12-22 20:42:29 +03:00
def get_default(self, p_name):
""" Returns default value for current settings type """
return self.setting_type.get_default_settings().get(p_name)
2019-12-13 13:31:07 +03:00
def add(self, name, value):
""" Adds extra options """
2019-12-22 20:42:29 +03:00
self._settings[name] = value
2019-12-13 13:31:07 +03:00
2021-08-21 14:50:05 +03:00
def get(self, name, default=None):
2019-12-22 20:42:29 +03:00
""" Returns extra options or None """
2021-08-21 14:50:05 +03:00
return self._settings.get(name, default)
2019-12-13 13:31:07 +03:00
@property
def settings(self):
""" Returns copy of the current settings! """
return copy.deepcopy(self._settings)
@settings.setter
def settings(self, value):
""" Sets copy of the settings! """
self._settings = copy.deepcopy(value)
@property
def current_profile(self):
return self._current_profile
@current_profile.setter
def current_profile(self, value):
self._current_profile = value
self._cp_settings = self._profiles.get(self._current_profile)
@property
def default_profile(self):
return self._settings.get("default_profile", "default")
@default_profile.setter
def default_profile(self, value):
self._settings["default_profile"] = value
2021-08-30 15:04:15 +03:00
@property
def current_profile_settings(self):
return self._cp_settings
2019-12-13 13:31:07 +03:00
@property
2019-12-22 20:42:29 +03:00
def profiles(self):
return self._profiles
2019-12-13 13:31:07 +03:00
2019-12-22 20:42:29 +03:00
@profiles.setter
def profiles(self, ps):
self._profiles = ps
self._settings["profiles"] = self._profiles
2019-12-13 13:31:07 +03:00
@property
2019-12-22 20:42:29 +03:00
def setting_type(self):
return SettingsType(self._cp_settings.get("setting_type", SettingsType.ENIGMA_2.value))
2019-12-13 13:31:07 +03:00
2019-12-22 20:42:29 +03:00
@setting_type.setter
def setting_type(self, s_type):
2020-01-08 14:50:04 +03:00
self._cp_settings["setting_type"] = s_type.value
2019-12-13 13:31:07 +03:00
2020-04-02 16:50:58 +03:00
# ******* Network ******** #
2020-01-09 13:14:49 +03:00
2019-12-13 13:31:07 +03:00
@property
def host(self):
2019-12-22 20:42:29 +03:00
return self._cp_settings.get("host", self.get_default("host"))
2019-12-13 13:31:07 +03:00
@host.setter
def host(self, value):
2019-12-22 20:42:29 +03:00
self._cp_settings["host"] = value
2019-12-13 13:31:07 +03:00
@property
def port(self):
2019-12-22 20:42:29 +03:00
return self._cp_settings.get("port", self.get_default("port"))
2019-12-13 13:31:07 +03:00
@port.setter
def port(self, value):
2019-12-22 20:42:29 +03:00
self._cp_settings["port"] = value
2019-12-13 13:31:07 +03:00
@property
def user(self):
2019-12-22 20:42:29 +03:00
return self._cp_settings.get("user", self.get_default("user"))
2019-12-13 13:31:07 +03:00
@user.setter
def user(self, value):
2019-12-22 20:42:29 +03:00
self._cp_settings["user"] = value
2019-12-13 13:31:07 +03:00
@property
def password(self):
2019-12-22 20:42:29 +03:00
return self._cp_settings.get("password", self.get_default("password"))
2019-12-13 13:31:07 +03:00
@password.setter
def password(self, value):
2019-12-22 20:42:29 +03:00
self._cp_settings["password"] = value
2019-12-13 13:31:07 +03:00
@property
def http_port(self):
2019-12-22 20:42:29 +03:00
return self._cp_settings.get("http_port", self.get_default("http_port"))
2019-12-13 13:31:07 +03:00
@http_port.setter
def http_port(self, value):
2019-12-22 20:42:29 +03:00
self._cp_settings["http_port"] = value
2019-12-13 13:31:07 +03:00
@property
def http_timeout(self):
2019-12-22 20:42:29 +03:00
return self._cp_settings.get("http_timeout", self.get_default("http_timeout"))
2019-12-13 13:31:07 +03:00
@http_timeout.setter
def http_timeout(self, value):
2019-12-22 20:42:29 +03:00
self._cp_settings["http_timeout"] = value
2019-12-13 13:31:07 +03:00
2020-01-03 23:26:55 +03:00
@property
def http_use_ssl(self):
return self._cp_settings.get("http_use_ssl", self.get_default("http_use_ssl"))
@http_use_ssl.setter
def http_use_ssl(self, value):
self._cp_settings["http_use_ssl"] = value
2019-12-13 13:31:07 +03:00
@property
def telnet_port(self):
2019-12-22 20:42:29 +03:00
return self._cp_settings.get("telnet_port", self.get_default("telnet_port"))
2019-12-13 13:31:07 +03:00
@telnet_port.setter
def telnet_port(self, value):
2019-12-22 20:42:29 +03:00
self._cp_settings["telnet_port"] = value
2019-12-13 13:31:07 +03:00
@property
def telnet_timeout(self):
2019-12-22 20:42:29 +03:00
return self._cp_settings.get("telnet_timeout", self.get_default("telnet_timeout"))
2019-12-13 13:31:07 +03:00
@telnet_timeout.setter
def telnet_timeout(self, value):
2019-12-22 20:42:29 +03:00
self._cp_settings["telnet_timeout"] = value
2019-12-13 13:31:07 +03:00
@property
def services_path(self):
2019-12-22 20:42:29 +03:00
return self._cp_settings.get("services_path", self.get_default("services_path"))
2019-12-13 13:31:07 +03:00
@services_path.setter
def services_path(self, value):
2019-12-22 20:42:29 +03:00
self._cp_settings["services_path"] = value
2019-12-13 13:31:07 +03:00
@property
def user_bouquet_path(self):
2019-12-22 20:42:29 +03:00
return self._cp_settings.get("user_bouquet_path", self.get_default("user_bouquet_path"))
2019-12-13 13:31:07 +03:00
@user_bouquet_path.setter
def user_bouquet_path(self, value):
2019-12-22 20:42:29 +03:00
self._cp_settings["user_bouquet_path"] = value
2019-12-13 13:31:07 +03:00
@property
def satellites_xml_path(self):
2019-12-22 20:42:29 +03:00
return self._cp_settings.get("satellites_xml_path", self.get_default("satellites_xml_path"))
2019-12-13 13:31:07 +03:00
@satellites_xml_path.setter
def satellites_xml_path(self, value):
2019-12-22 20:42:29 +03:00
self._cp_settings["satellites_xml_path"] = value
2019-12-13 13:31:07 +03:00
@property
def picons_path(self):
2019-12-22 20:42:29 +03:00
return self._cp_settings.get("picons_path", self.get_default("picons_path"))
2019-12-13 13:31:07 +03:00
@picons_path.setter
def picons_path(self, value):
2019-12-22 20:42:29 +03:00
self._cp_settings["picons_path"] = value
2019-12-13 13:31:07 +03:00
2021-08-27 00:19:16 +03:00
@property
def picons_paths(self):
if self.setting_type is SettingsType.NEUTRINO_MP:
return self._settings.get("neutrino_picon_paths", Defaults.NEUTRINO_BOX_PICON_PATHS.value)
else:
return self._settings.get("picon_paths", Defaults.BOX_PICON_PATHS.value)
@picons_paths.setter
def picons_paths(self, value):
if self.setting_type is SettingsType.NEUTRINO_MP:
self._settings["neutrino_picon_paths"] = value
else:
self._settings["picon_paths"] = value
2021-08-27 00:19:16 +03:00
2020-03-06 11:55:34 +03:00
# ***** Local paths ***** #
@property
def profile_folder_is_default(self):
return self._settings.get("profile_folder_is_default", Defaults.PROFILE_FOLDER_DEFAULT.value)
@profile_folder_is_default.setter
def profile_folder_is_default(self, value):
self._settings["profile_folder_is_default"] = value
@property
2021-08-30 15:04:15 +03:00
def default_data_path(self):
return self._settings.get("default_data_path", DATA_PATH)
2020-03-06 11:55:34 +03:00
2021-08-30 15:04:15 +03:00
@default_data_path.setter
def default_data_path(self, value):
self._settings["default_data_path"] = value
2020-03-06 11:55:34 +03:00
2019-12-13 13:31:07 +03:00
@property
2021-08-30 15:04:15 +03:00
def default_backup_path(self):
return self._settings.get("default_backup_path", Defaults.BACKUP_PATH.value)
2019-12-13 13:31:07 +03:00
2021-08-30 15:04:15 +03:00
@default_backup_path.setter
def default_backup_path(self, value):
self._settings["default_backup_path"] = value
2019-12-13 13:31:07 +03:00
@property
2021-08-30 15:04:15 +03:00
def default_picon_path(self):
return self._settings.get("default_picon_path", Defaults.PICON_PATH.value)
2019-12-13 13:31:07 +03:00
2021-08-30 15:04:15 +03:00
@default_picon_path.setter
def default_picon_path(self, value):
self._settings["default_picon_path"] = value
@property
def profile_data_path(self):
2022-03-10 23:06:06 +03:00
return f"{self.default_data_path}data{SEP}{self._current_profile}{SEP}"
2021-08-30 15:04:15 +03:00
@profile_data_path.setter
def profile_data_path(self, value):
self._cp_settings["profile_data_path"] = value
@property
def profile_picons_path(self):
if self.profile_folder_is_default:
2022-03-10 23:06:06 +03:00
return f"{self.profile_data_path}picons{SEP}"
return f"{self.default_picon_path}{self._current_profile}{SEP}"
2021-08-30 15:04:15 +03:00
@profile_picons_path.setter
def profile_picons_path(self, value):
self._cp_settings["profile_picons_path"] = value
@property
def profile_backup_path(self):
if self.profile_folder_is_default:
2022-03-10 23:06:06 +03:00
return f"{self.profile_data_path}backup{SEP}"
return f"{self.default_backup_path}{self._current_profile}{SEP}"
2021-08-30 15:04:15 +03:00
@profile_backup_path.setter
def profile_backup_path(self, value):
self._cp_settings["profile_backup_path"] = value
2019-12-22 20:42:29 +03:00
2020-03-06 11:55:34 +03:00
@property
def records_path(self):
return self._settings.get("records_path", Defaults.RECORDS_PATH.value)
@records_path.setter
def records_path(self, value):
self._settings["records_path"] = value
2020-03-09 14:53:03 +03:00
# ******** Streaming ********* #
@property
def activate_transcoding(self):
return self._settings.get("activate_transcoding", Defaults.ACTIVATE_TRANSCODING.value)
@activate_transcoding.setter
def activate_transcoding(self, value):
self._settings["activate_transcoding"] = value
@property
def active_preset(self):
return self._settings.get("active_preset", Defaults.ACTIVE_TRANSCODING_PRESET.value)
@active_preset.setter
def active_preset(self, value):
self._settings["active_preset"] = value
@property
def transcoding_presets(self):
2021-08-30 15:04:15 +03:00
return self._settings.get("transcoding_presets", self.get_default_transcoding_presets())
2020-03-09 14:53:03 +03:00
@transcoding_presets.setter
def transcoding_presets(self, value):
self._settings["transcoding_presets"] = value
2020-03-22 14:13:01 +03:00
@property
def play_streams_mode(self):
return PlayStreamsMode(self._settings.get("play_streams_mode", Defaults.PLAY_STREAMS_MODE.value))
@play_streams_mode.setter
def play_streams_mode(self, value):
self._settings["play_streams_mode"] = value
@property
def stream_lib(self):
return self._settings.get("stream_lib", Defaults.STREAM_LIB.value)
@stream_lib.setter
def stream_lib(self, value):
self._settings["stream_lib"] = value
2022-03-10 23:06:06 +03:00
@property
def fav_click_mode(self):
return self._settings.get("fav_click_mode", Defaults.FAV_CLICK_MODE.value)
@fav_click_mode.setter
def fav_click_mode(self, value):
self._settings["fav_click_mode"] = value
@property
def main_list_playback(self):
return self._settings.get("main_list_playback", Defaults.MAIN_LIST_PLAYBACK.value)
@main_list_playback.setter
def main_list_playback(self, value):
self._settings["main_list_playback"] = value
2020-04-02 16:50:58 +03:00
# *********** EPG ************ #
@property
def epg_options(self):
""" Options used by the EPG dialog. """
return self._cp_settings.get("epg_options", None)
@epg_options.setter
def epg_options(self, value):
self._cp_settings["epg_options"] = value
# *********** FTP ************ #
@property
def ftp_bookmarks(self):
return self._cp_settings.get("ftp_bookmarks", [])
@ftp_bookmarks.setter
def ftp_bookmarks(self, value):
self._cp_settings["ftp_bookmarks"] = value
2020-03-09 14:53:03 +03:00
# ***** Program settings ***** #
2019-12-13 13:31:07 +03:00
@property
def backup_before_save(self):
2019-12-22 20:42:29 +03:00
return self._settings.get("backup_before_save", Defaults.BACKUP_BEFORE_SAVE.value)
2019-12-13 13:31:07 +03:00
@backup_before_save.setter
def backup_before_save(self, value):
2019-12-22 20:42:29 +03:00
self._settings["backup_before_save"] = value
2019-12-13 13:31:07 +03:00
@property
def backup_before_downloading(self):
2019-12-22 20:42:29 +03:00
return self._settings.get("backup_before_downloading", Defaults.BACKUP_BEFORE_DOWNLOADING.value)
2019-12-13 13:31:07 +03:00
@backup_before_downloading.setter
def backup_before_downloading(self, value):
2019-12-22 20:42:29 +03:00
self._settings["backup_before_downloading"] = value
2019-12-13 13:31:07 +03:00
@property
def v5_support(self):
2019-12-22 20:42:29 +03:00
return self._settings.get("v5_support", Defaults.V5_SUPPORT.value)
2019-12-13 13:31:07 +03:00
@v5_support.setter
def v5_support(self, value):
2019-12-22 20:42:29 +03:00
self._settings["v5_support"] = value
2019-12-13 13:31:07 +03:00
2020-04-16 11:55:48 +03:00
@property
def force_bq_names(self):
return self._settings.get("force_bq_names", Defaults.FORCE_BQ_NAMES.value)
@force_bq_names.setter
def force_bq_names(self, value):
self._settings["force_bq_names"] = value
2019-12-13 13:31:07 +03:00
@property
def http_api_support(self):
2019-12-22 20:42:29 +03:00
return self._settings.get("http_api_support", Defaults.HTTP_API_SUPPORT.value)
2019-12-13 13:31:07 +03:00
@http_api_support.setter
def http_api_support(self, value):
2019-12-22 20:42:29 +03:00
self._settings["http_api_support"] = value
2019-12-13 13:31:07 +03:00
@property
def enable_yt_dl(self):
2019-12-22 20:42:29 +03:00
return self._settings.get("enable_yt_dl", Defaults.ENABLE_YT_DL.value)
2019-12-13 13:31:07 +03:00
@enable_yt_dl.setter
def enable_yt_dl(self, value):
2019-12-22 20:42:29 +03:00
self._settings["enable_yt_dl"] = value
2019-12-13 13:31:07 +03:00
2020-05-29 16:43:23 +03:00
@property
def enable_yt_dl_update(self):
return self._settings.get("enable_yt_dl_update", Defaults.ENABLE_YT_DL.value)
@enable_yt_dl_update.setter
def enable_yt_dl_update(self, value):
self._settings["enable_yt_dl_update"] = value
2019-12-13 13:31:07 +03:00
@property
def enable_send_to(self):
2019-12-22 20:42:29 +03:00
return self._settings.get("enable_send_to", Defaults.ENABLE_SEND_TO.value)
2019-12-13 13:31:07 +03:00
@enable_send_to.setter
def enable_send_to(self, value):
2019-12-22 20:42:29 +03:00
self._settings["enable_send_to"] = value
2019-12-13 13:31:07 +03:00
2020-04-02 16:50:58 +03:00
@property
def language(self):
return self._settings.get("language", locale.getlocale()[0] or "en_US")
@language.setter
def language(self, value):
self._settings["language"] = value
@property
def load_last_config(self):
return self._settings.get("load_last_config", False)
@load_last_config.setter
def load_last_config(self, value):
self._settings["load_last_config"] = value
2020-04-19 17:20:51 +03:00
@property
def show_srv_hints(self):
""" Show short info as hints in the main services list. """
return self._settings.get("show_srv_hints", True)
@show_srv_hints.setter
def show_srv_hints(self, value):
self._settings["show_srv_hints"] = value
2020-04-05 18:19:12 +03:00
@property
def show_bq_hints(self):
""" Show detailed info as hints in the bouquet list. """
return self._settings.get("show_bq_hints", True)
@show_bq_hints.setter
def show_bq_hints(self, value):
self._settings["show_bq_hints"] = value
2020-04-13 13:46:02 +03:00
# *********** Appearance *********** #
@property
def list_font(self):
return self._settings.get("list_font", "")
@list_font.setter
def list_font(self, value):
self._settings["list_font"] = value
@property
def list_picon_size(self):
return self._settings.get("list_picon_size", Defaults.LIST_PICON_SIZE.value)
@list_picon_size.setter
def list_picon_size(self, value):
self._settings["list_picon_size"] = value
@property
def tooltip_logo_size(self):
return self._settings.get("tooltip_logo_size", Defaults.TOOLTIP_LOGO_SIZE.value)
@tooltip_logo_size.setter
def tooltip_logo_size(self, value):
self._settings["tooltip_logo_size"] = value
@property
def use_colors(self):
return self._settings.get("use_colors", Defaults.USE_COLORS.value)
@use_colors.setter
def use_colors(self, value):
self._settings["use_colors"] = value
@property
def new_color(self):
return self._settings.get("new_color", Defaults.NEW_COLOR.value)
@new_color.setter
def new_color(self, value):
self._settings["new_color"] = value
@property
def extra_color(self):
return self._settings.get("extra_color", Defaults.EXTRA_COLOR.value)
@extra_color.setter
def extra_color(self, value):
self._settings["extra_color"] = value
2020-08-08 14:43:26 +03:00
@property
def dark_mode(self):
2021-09-23 18:21:55 +03:00
if IS_DARWIN:
import subprocess
cmd = ["defaults", "read", "-g", "AppleInterfaceStyle"]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
return "Dark" in str(p[0])
2020-08-08 14:43:26 +03:00
return self._settings.get("dark_mode", False)
@dark_mode.setter
def dark_mode(self, value):
self._settings["dark_mode"] = value
2022-01-05 00:41:06 +03:00
@property
def display_picons(self):
return self._settings.get("display_picons", True)
@display_picons.setter
def display_picons(self, value):
self._settings["display_picons"] = value
2020-12-18 22:13:15 +03:00
@property
def alternate_layout(self):
return self._settings.get("alternate_layout", IS_DARWIN)
@alternate_layout.setter
def alternate_layout(self, value):
self._settings["alternate_layout"] = value
@property
def bq_details_first(self):
return self._settings.get("bq_details_first", False)
@bq_details_first.setter
def bq_details_first(self, value):
self._settings["bq_details_first"] = value
2020-04-13 13:46:02 +03:00
@property
def is_themes_support(self):
return self._settings.get("is_themes_support", False)
@is_themes_support.setter
def is_themes_support(self, value):
self._settings["is_themes_support"] = value
@property
def theme(self):
return self._settings.get("theme", "Default")
@theme.setter
def theme(self, value):
self._settings["theme"] = value
@property
@lru_cache(1)
def themes_path(self):
2022-01-05 00:41:06 +03:00
return f"{HOME_PATH}{SEP}.themes{SEP}"
2020-04-13 13:46:02 +03:00
@property
def icon_theme(self):
return self._settings.get("icon_theme", "Adwaita")
@icon_theme.setter
def icon_theme(self, value):
self._settings["icon_theme"] = value
@property
@lru_cache(1)
def icon_themes_path(self):
2022-01-05 00:41:06 +03:00
return f"{HOME_PATH}{SEP}.icons{SEP}"
2020-04-13 13:46:02 +03:00
2020-03-22 14:13:01 +03:00
@property
def is_darwin(self):
return IS_DARWIN
2022-05-04 20:49:33 +03:00
# ************* Download ************** #
2020-07-04 13:38:39 +03:00
@property
def use_http(self):
return self._settings.get("use_http", True)
@use_http.setter
def use_http(self, value):
self._settings["use_http"] = value
@property
def remove_unused_bouquets(self):
return self._settings.get("remove_unused_bouquets", True)
@remove_unused_bouquets.setter
def remove_unused_bouquets(self, value):
self._settings["remove_unused_bouquets"] = value
2022-05-04 20:49:33 +03:00
@property
def compress_picons(self):
return self._settings.get("compress_picons", False)
@compress_picons.setter
def compress_picons(self, value):
self._settings["compress_picons"] = value
2020-07-11 12:58:03 +03:00
# **************** Debug **************** #
@property
def debug_mode(self):
return self._settings.get("debug_mode", False)
@debug_mode.setter
def debug_mode(self, value):
self._settings["debug_mode"] = value
2020-08-03 22:41:14 +03:00
# **************** Experimental **************** #
@property
def is_enable_experimental(self):
""" Allows experimental functionality. """
return self._settings.get("enable_experimental", False)
@is_enable_experimental.setter
def is_enable_experimental(self, value):
self._settings["enable_experimental"] = value
2021-08-30 15:04:15 +03:00
# **************** Get-Set settings **************** #
@staticmethod
def get_settings():
if not os.path.isfile(CONFIG_FILE) or os.stat(CONFIG_FILE).st_size == 0:
Settings.write_settings(Settings.get_default_settings())
with open(CONFIG_FILE, "r", encoding="utf-8") as config_file:
2022-03-10 23:06:06 +03:00
try:
return json.load(config_file)
except ValueError as e:
raise SettingsReadException(e)
2021-08-30 15:04:15 +03:00
@staticmethod
def get_default_settings(profile_name="default"):
def_settings = SettingsType.ENIGMA_2.get_default_settings()
return {
"version": Settings.__VERSION,
"default_profile": Defaults.DEFAULT_PROFILE.value,
"profiles": {profile_name: def_settings},
"v5_support": Defaults.V5_SUPPORT.value,
"http_api_support": Defaults.HTTP_API_SUPPORT.value,
"enable_yt_dl": Defaults.ENABLE_YT_DL.value,
"enable_send_to": Defaults.ENABLE_SEND_TO.value,
"use_colors": Defaults.USE_COLORS.value,
"new_color": Defaults.NEW_COLOR.value,
"extra_color": Defaults.EXTRA_COLOR.value,
"fav_click_mode": Defaults.FAV_CLICK_MODE.value,
"profile_folder_is_default": Defaults.PROFILE_FOLDER_DEFAULT.value,
"records_path": Defaults.RECORDS_PATH.value
}
@staticmethod
def get_default_transcoding_presets():
return {"720p TV/device": {"vcodec": "h264", "vb": "1500", "width": "1280", "height": "720", "acodec": "mp3",
"ab": "192", "channels": "2", "samplerate": "44100", "scodec": "none"},
"1080p TV/device": {"vcodec": "h264", "vb": "3500", "width": "1920", "height": "1080", "acodec": "mp3",
"ab": "192", "channels": "2", "samplerate": "44100", "scodec": "none"}}
@staticmethod
def write_settings(config):
os.makedirs(os.path.dirname(CONFIG_PATH), exist_ok=True)
with open(CONFIG_FILE, "w", encoding="utf-8") as config_file:
json.dump(config, config_file, indent=" ")
2019-12-13 13:31:07 +03:00
if __name__ == "__main__":
pass