FastLBRY-GTK-master/flbry/settings.py
auser e2cdd0e5fc Add commit 6a34355fda files minus lbrynet binary
Add files from 6a34355fda commit of FastLBRY-GTK notabug.org repo
by jyamihud without the flbry/lbrynet binary
2026-09-29 20:07:22 +00:00

532 lines
20 KiB
Python

#####################################################################
# #
# THIS IS A SOURCE CODE FILE FROM A PROGRAM TO INTERACT WITH THE #
# LBRY PROTOCOL ( lbry.com ). IT WILL USE THE LBRY SDK ( lbrynet ) #
# FROM THEIR REPOSITORY ( https://github.com/lbryio/lbry-sdk ) #
# WHICH I GONNA PRESENT TO YOU AS A BINARY. SINCE I DID NOT DEVELOP #
# IT AND I'M LAZY TO INTEGRATE IN A MORE SMART WAY. THE SOURCE CODE #
# OF THE SDK IS AVAILABLE IN THE REPOSITORY MENTIONED ABOVE. #
# #
# ALL THE CODE IN THIS REPOSITORY INCLUDING THIS FILE IS #
# (C) J.Y.Amihud and Other Contributors 2021. EXCEPT THE LBRY SDK. #
# YOU CAN USE THIS FILE AND ANY OTHER FILE IN THIS REPOSITORY UNDER #
# THE TERMS OF GNU GENERAL PUBLIC LICENSE VERSION 3 OR ANY LATER #
# VERSION. TO FIND THE FULL TEXT OF THE LICENSE GO TO THE GNU.ORG #
# WEBSITE AT ( https://www.gnu.org/licenses/gpl-3.0.html ). #
# #
# THE LBRY SDK IS UNFORTUNATELY UNDER THE MIT LICENSE. IF YOU ARE #
# NOT INTENDING TO USE MY CODE AND JUST THE SDK. YOU CAN FIND IT ON #
# THEIR OFFICIAL REPOSITORY ABOVE. THEIR LICENSE CHOICE DOES NOT #
# SPREAD ONTO THIS PROJECT. DON'T GET A FALSE ASSUMPTION THAT SINCE #
# THEY USE A PUSH-OVER LICENSE, I GONNA DO THE SAME. I'M NOT. #
# #
# THE LICENSE CHOSEN FOR THIS PROJECT WILL PROTECT THE 4 ESSENTIAL #
# FREEDOMS OF THE USER FURTHER, BY NOT ALLOWING ANY WHO TO CHANGE #
# THE LICENSE AT WILL. SO NO PROPRIETARY SOFTWARE DEVELOPER COULD #
# TAKE THIS CODE AND MAKE THEIR USER-SUBJUGATING SOFTWARE FROM IT. #
# #
#####################################################################
# This file will handle all kinds of settings
import os
import json
from gi.repository import Gtk
from flbry import ui
from flbry import fetch
from flbry import odysee
from flbry import comments
def get_settings_folder(flbry="flbry/"):
try:
data_dir = os.environ["XDG_DATA_HOME"] + "/" + flbry # Reducted back since it
# broke too much and made
# my settings appear in
# $XDG_DATA_HOME folder
# inside the repository.
# WTF !!!
except:
data_dir = os.path.expanduser("~/.local/share/"+flbry)
try:
os.makedirs(data_dir)
except:
pass
return data_dir
def load():
with open(get_settings_folder()+'config.json') as json_file:
data = json.load(json_file)
return data
def save(data):
with open(get_settings_folder()+'config.json', 'w') as fp:
json.dump(data, fp, sort_keys=True, indent=4)
def make_sure_file_exists():
# Let's make some defaults
defaults = {
"GTK_icon_theme":"System Theme",
"notifications":True,
"auth_token": "",
"autoconnect": False,
"comment_api": "https://comments.odysee.com/api/v2",
"lbrynet_binary": "flbry/lbrynet",
"librarian_instance": "https://librarian.pussthecat.org/",
"promote_fast_lbry_in_comments":False,
"promote_fast_lbry_text": comments.BUTTON_GTK_PROMOTE_TEXT,
"filter_tags":["mature", "sex", "porn"],
"lock_password":"",
"live_stream_player":"vlc",
"default_tab":"following",
"comments_auto_resize":True
}
# List of old and unneded or changed setting names. For example if
# there was a spelling error in the key. This list exists for
# backward compatibility, so users could update to the new version
# without seeing two separate settings all of a sudden.
old_and_bad = [
"promote_fast_lbry_in_commnets" # issue #26 | Bad spelling
]
# Let's write the Default theme.
try:
with open(get_settings_folder()+"config.json") as f:
data = json.load(f)
# Adding missing
for i in defaults:
if i not in data:
data[i] = defaults[i]
# Removing bad
for i in old_and_bad:
if i in data:
del data[i]
except Exception as e:
data = defaults
with open(get_settings_folder()+'config.json', 'w') as fp:
json.dump(data, fp, sort_keys=True, indent=4)
def dialogue(w, win):
# This is the settings dialogue
# Configuring the window
dialogWindow = Gtk.Dialog("FastLBRY - Settings",
buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
Gtk.STOCK_OK, Gtk.ResponseType.OK),
)
dialogWindow.set_size_request(500,500)
dialogWindow.set_default_icon_from_file("icon.png")
mainbox = dialogWindow.get_content_area()
# We will break the settings into tabs of various importances.
notebook = Gtk.Notebook()
notebook.set_scrollable(True)
mainbox.pack_start(notebook, 1,1,0)
#######################################################################
# #
# ACCOUNT / WALLET #
# #
#######################################################################
scrl = Gtk.ScrolledWindow()
box = Gtk.VBox()
scrl.add(box)
notebook.append_page(scrl, Gtk.Label("Account / Wallet"))
# We need to get a list of all of the wallets on this system
try:
wallets = fetch.lbrynet("wallet_list")["items"]
except:
wallets = []
for n, wallet in enumerate(wallets):
wallet_frame = Gtk.Expander(label=wallet.get("name", ""))
if n == 0:
wallet_frame.set_expanded(True)
box.pack_start(wallet_frame, 0,0,5)
wbox = Gtk.VBox()
wallet_frame.add(wbox)
# Odysee sync button
def sync_do(w):
response = odysee.sync_ui(win)
if "auth_token" in response:
auth_e.set_text(response["auth_token"])
win.settings["auth_token"] = response["auth_token"]
save(win.settings)
odysee_sync = Gtk.Button()
odysee_sync.connect("clicked", sync_do)
odysee_sync.set_relief(Gtk.ReliefStyle.NONE)
obox = Gtk.HBox()
odysee_sync.add(obox)
obox.pack_start(Gtk.Image.new_from_file("icons/odysee.png"),0,0,2)
obox.pack_start(Gtk.Label("Sync with Odysee"), 1,1,2)
wbox.pack_start(odysee_sync, 0,0,2)
box.pack_start(Gtk.HSeparator(), 0,0,10)
# Auth Token
auth_box = Gtk.HBox()
box.pack_start(auth_box, 0,0,5)
auth_box.pack_start(Gtk.Label("Authentication Token : "),0,0,5)
auth_w, auth_e = ui.password_entry(win)
auth_box.pack_start(auth_w, 1,1,5)
auth_e.set_text(win.settings["auth_token"])
# Lock Password
lock_box = Gtk.HBox()
box.pack_start(lock_box, 0,0,5)
lock_box.pack_start(Gtk.Label("Wallet Lock Password : "),0,0,5)
lock_w, lock_e = ui.password_entry(win)
lock_box.pack_start(lock_w, 1,1,5)
lock_e.set_text(win.settings["lock_password"])
#######################################################################
# #
# COMMENTS #
# #
#######################################################################
scrl = Gtk.ScrolledWindow()
box = Gtk.VBox()
scrl.add(box)
notebook.append_page(scrl, Gtk.Label("Comments"))
# Here will be the settings for comments.
promote_box = Gtk.HBox()
box.pack_start(promote_box, 0,0,5)
promote_box.pack_start(Gtk.Label("Promote FastLBRY in Comments: "), 0,0,5)
def hide_promotion_options(w, u):
promote_options_box.set_visible(w.get_active())
promote_fastlbry_switch = Gtk.Switch()
promote_fastlbry_switch.connect("notify::active", hide_promotion_options)
promote_fastlbry_switch.set_active(win.settings["promote_fast_lbry_in_comments"])
promote_box.pack_end(promote_fastlbry_switch, 0,0,0)
# Options of the promotion will come next. They are in a separate box, so I could
# hide it when promotion is not activated.
promote_options_box = Gtk.VBox()
box.pack_start(promote_options_box, 0,0,5)
type_of_promotion = Gtk.ComboBoxText()
type_of_promotion.append_text( "Image Link" )
type_of_promotion.append_text( "Text Link" )
type_of_promotion.append_text( "Custom" )
ptype_box = Gtk.HBox()
promote_options_box.pack_start(ptype_box, 0,0,5)
ptype_box.pack_start(Gtk.Label("Promotion Type: "), 0,0,5)
ptype_box.pack_end(type_of_promotion, 0,0,5)
def hide_custom_promotion(w):
if type_of_promotion.get_active_text() == "Custom":
pcustom_box.set_visible(True)
else:
pcustom_box.set_visible(False)
type_of_promotion.connect("changed", hide_custom_promotion)
pcustom_box = Gtk.HBox()
promote_options_box.pack_start(pcustom_box, 0,0,5)
pcustom_box.pack_start(Gtk.Label("Custom Promotion: "), 0,0,5)
pcustom_entry = Gtk.Entry()
pcustom_entry.set_text(win.settings["promote_fast_lbry_text"])
pcustom_box.pack_end(pcustom_entry, 0,0,5)
box.pack_start(Gtk.HSeparator(), 0,0,5)
# Scaling of comments
cscalebox = Gtk.HBox()
cscalebox.pack_start(Gtk.Label(" Force-fit comments to window: "), 0,0,5)
commentScaleSwitch = Gtk.Switch()
commentScaleSwitch.set_active(win.settings["comments_auto_resize"])
cscalebox.pack_end(commentScaleSwitch, 0,0,5)
box.pack_start(cscalebox, 0,0,5)
box.pack_start(Gtk.HSeparator(), 0,0,5)
# Advanced commment settings
advanced_frame = Gtk.Expander(label="Advanced Settings")
box.pack_start(advanced_frame, 0,0,5)
adbox = Gtk.VBox()
advanced_frame.add(adbox)
# Comment API setting. For talking on different comment servers.
commentAPIbox = Gtk.HBox()
adbox.pack_start(commentAPIbox, 0,0,5)
commentAPIbox.pack_start(Gtk.Label(" Comment server: ") , 0,0,5)
commentserverentry = Gtk.Entry()
commentserverentry.set_text(win.settings["comment_api"])
commentAPIbox.pack_start(commentserverentry , 1,1,5)
#######################################################################
# #
# ALL THE REST #
# #
#######################################################################
scrl = Gtk.ScrolledWindow()
box = Gtk.VBox()
scrl.add(box)
notebook.append_page(scrl, Gtk.Label("Other Settings"))
#######################################################################
# #
# THEMES SELECTOR #
# #
#######################################################################
themes_setting = Gtk.ComboBoxText()
#themes_setting.set_relief(Gtk.ReliefStyle.NONE)
# Themes are laoded from folder in ./icons
select = 0
icon_themes = os.listdir(os.getcwd()+"/icons")
icon_themes.append("System Theme")
for n, theme in enumerate(icon_themes):
themes_setting.append_text( theme )
if win.settings["GTK_icon_theme"] == theme:
select = n
themes_setting.set_active(select)
theme_box = Gtk.HBox()
theme_box.pack_start(Gtk.Label(" Icon Theme (requires restart) : "), False, False, False)
theme_box.pack_end(themes_setting, False, False, False)
box.pack_start(theme_box, False, False, 5)
# The default tab. Whether it's following or suggestions
default_tab = Gtk.ComboBoxText()
default_tab.append_text("Following")
default_tab.append_text("Suggestions")
if win.settings["default_tab"] == "suggest":
default_tab.set_active(1)
else:
default_tab.set_active(0)
default_box = Gtk.HBox()
default_box.pack_start(Gtk.Label(" Default Tab : "), False, False, False)
default_box.pack_end(default_tab, False, False, False)
box.pack_start(default_box, False, False, 5)
#######################################################################
# #
# ALL THE REST #
# #
#######################################################################
# The settings are SHARED WITH FASTLBRY TERMINAL
# The rest of settings are generated by what's available in the config
# file. So there could be problems. First we need exclude list.
exclude = ["GTK_icon_theme", # We have a separate thing for it
"save_history", # Used by FastLBRY terminal, not interesting here
"theme", # The theme of FastLBRY terminal
"default_tip",
"default_opener",
"dev_mode",
"default_editor",
"music_player",
"player",
"markdown_reader",# In FastLBRY GTK we have a UI implementation for this
"graph_force_ASCII", # Another FastLBRY Termianl only function
"ignore_width_forcing", # FASTLBRY TERMINAL AGAIN
"channel", # This one is set in the top pannel of the window
"default_tab", # Implemented separately
"auth_token", # [ Account / Wallet ] Tab
"lock_password", # [ Account / Wallet ] Tab
"promote_fast_lbry_in_comments", # [ Comments ] Tab
"promote_fast_lbry_text", # [ Comments ] Tab
"comment_api", # [ Comments ] Tab
"comments_auto_resize" # [ Comments ] Tab
]
parts = {}
for name in win.settings:
if name in exclude:
continue
parts[name] = {}
parts[name]["box"] = Gtk.HBox()
# I want to beutify the name for the setting
pname = name.replace("_", " ")
pname = " "+pname[0].upper()+pname[1:].lower()+" "
parts[name]["box"].pack_start(Gtk.Label(pname), False, False, False)
# Then depending on the type of the data itself, we are going to give
# inputs
if type(win.settings[name]) == str:
parts[name]["entry"] = Gtk.Entry()
parts[name]["entry"].set_text(win.settings[name])
parts[name]["entry"].set_size_request(300,40)
parts[name]["box"].pack_end(parts[name]["entry"], False, False, False)
elif type(win.settings[name]) == bool:
parts[name]["entry"] = Gtk.Switch()
parts[name]["entry"].set_active(win.settings[name])
parts[name]["box"].pack_end(parts[name]["entry"], False, False, False)
elif type(win.settings[name]) == float:
parts[name]["number"] = Gtk.Adjustment(win.settings[name],
lower=0.0001,
upper=1000000000,
step_increment=0.1)
parts[name]["entry"] = Gtk.SpinButton(adjustment=parts[name]["number"],
digits=4)
parts[name]["box"].pack_end(parts[name]["entry"], False, False, False)
elif type(win.settings[name]) == int:
parts[name]["number"] = Gtk.Adjustment(win.settings[name],
lower=0,
upper=1000000000,
step_increment=4)
parts[name]["entry"] = Gtk.SpinButton(adjustment=parts[name]["number"])
parts[name]["box"].pack_end(parts[name]["entry"], False, False, False)
elif type(win.settings[name]) == list:
parts[name]["box"] = Gtk.VBox()
parts[name]["box"].pack_start(Gtk.Label(pname), False, False, False)
parts[name]["box"].pack_start( ui.tags_editor(win, win.settings[name]), True, True, 0)
box.pack_start(parts[name]["box"], False, False, 5)
# notifications_box = Gtk.HBox()
# notifications_setting = Gtk.Switch()
# notifications_setting.set_active(win.settings["notifications"])
# notifications_box.pack_start(Gtk.Label(" Notifications: "), False, False, False)
# notifications_box.pack_end(notifications_setting, False, False, False)
# box.pack_start(notifications_box, False, False, False)
#######################################################################
# #
# RUNING THE SETTINGS DIALOG #
# #
#######################################################################
# Running the dialog
mainbox.show_all()
# Hide element
if not win.settings["promote_fast_lbry_in_comments"]:
promote_options_box.set_visible(False)
if win.settings["promote_fast_lbry_text"] == comments.BUTTON_GTK_PROMOTE:
type_of_promotion.set_active(0)
elif win.settings["promote_fast_lbry_text"] == comments.BUTTON_GTK_PROMOTE_TEXT:
type_of_promotion.set_active(1)
else:
type_of_promotion.set_active(2)
response = dialogWindow.run()
if response == Gtk.ResponseType.OK:
# Here I want to overwrite all the setting to ones
# chosen by the user.
win.settings["GTK_icon_theme"] = themes_setting.get_active_text()
win.settings["auth_token"] = auth_e.get_text()
win.settings["lock_password"] = lock_e.get_text()
win.settings["comment_api"] = commentserverentry.get_text()
win.settings["comments_auto_resize"] = commentScaleSwitch.get_active()
win.settings["promote_fast_lbry_in_comments"] = promote_fastlbry_switch.get_active()
if type_of_promotion.get_active_text() == "Image Link":
win.settings["promote_fast_lbry_text"] = comments.BUTTON_GTK_PROMOTE
elif type_of_promotion.get_active_text() == "Text Link":
win.settings["promote_fast_lbry_text"] = comments.BUTTON_GTK_PROMOTE_TEXT
else:
win.settings["promote_fast_lbry_text"] = pcustom_entry.get_text()
if default_tab.get_active_text() == "Suggestions":
win.settings["default_tab"] = "suggest"
else:
win.settings["default_tab"] = "following"
for name in win.settings:
if name in exclude:
continue
value = win.settings[name]
if type(win.settings[name]) == str:
value = parts[name]["entry"].get_text()
elif type(win.settings[name]) == bool:
value = parts[name]["entry"].get_active()
elif type(win.settings[name]) == int:
value = int(parts[name]["entry"].get_value())
elif type(win.settings[name]) == float:
value = parts[name]["entry"].get_value()
win.settings[name] = value
# Then we save everything.
save(win.settings)
if not win.settings["lock_password"]:
win.lock_button.set_sensitive(False)
else:
win.lock_button.set_sensitive(True)
dialogWindow.destroy()