Some preparing for Qt support...
This commit is contained in:
@@ -0,0 +1,125 @@
|
||||
import base64
|
||||
import binascii
|
||||
import json
|
||||
import urllib
|
||||
import winreg
|
||||
from pathlib import Path
|
||||
from urllib.parse import unquote
|
||||
import sys
|
||||
import os
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger("PlaylistSaver.Utils")
|
||||
logger.setLevel(logging.INFO)
|
||||
logger.addHandler(logging.StreamHandler(sys.stdout))
|
||||
|
||||
def set_info(target_logger):
|
||||
global logger
|
||||
logger = target_logger
|
||||
|
||||
def key_exists(hive, sub_key):
|
||||
try:
|
||||
# Attempt to open the key for reading
|
||||
with winreg.OpenKey(hive, sub_key, 0, winreg.KEY_READ) as key:
|
||||
return True
|
||||
except FileNotFoundError:
|
||||
return False
|
||||
|
||||
def create_url_scheme():
|
||||
try:
|
||||
scheme = "PlaylistSaver"
|
||||
base = r"Software\Classes\\" + scheme
|
||||
|
||||
key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, base)
|
||||
|
||||
winreg.SetValueEx(key, None, 0, winreg.REG_SZ, f"URL:{scheme} Protocol")
|
||||
winreg.SetValueEx(key, "URL Protocol", 0, winreg.REG_SZ, "")
|
||||
|
||||
shell_key = winreg.CreateKey(key, "shell")
|
||||
open_key = winreg.CreateKey(shell_key, "open")
|
||||
command_key = winreg.CreateKey(open_key, "command")
|
||||
|
||||
if getattr(sys, 'frozen', False):
|
||||
command = f"\"{sys.executable}\" \"%1\""
|
||||
else:
|
||||
command = f"\"{sys.executable}\" \"{os.path.abspath(__file__)}\" \"%1\""
|
||||
|
||||
winreg.SetValueEx(command_key, None, 0, winreg.REG_SZ, command)
|
||||
|
||||
logger.info("URL scheme registered.")
|
||||
|
||||
except OSError as e:
|
||||
logger.error("Unable to create URL scheme:", e)
|
||||
|
||||
def check_url_scheme():
|
||||
try:
|
||||
if not key_exists(winreg.HKEY_LOCAL_MACHINE, "PlaylistSaver"):
|
||||
create_url_scheme()
|
||||
except FileNotFoundError:
|
||||
create_url_scheme()
|
||||
|
||||
def read_cookies(cookie_path):
|
||||
try:
|
||||
with open(cookie_path, "r", encoding='utf-8') as f:
|
||||
return f.read()
|
||||
except FileNotFoundError:
|
||||
logger.error("Cookies file not found.")
|
||||
except Exception as e:
|
||||
logger.error("An unexpected error occurred while reading cookies:", e)
|
||||
|
||||
def save_cookies(cookies, cookie_path):
|
||||
try:
|
||||
os.makedirs(os.path.dirname(cookie_path), exist_ok=True)
|
||||
with open(cookie_path, "w", encoding='utf-8') as f:
|
||||
f.write(cookies)
|
||||
except Exception as e:
|
||||
logger.error("An unexpected error occurred while saving cookies:", e)
|
||||
|
||||
def save_base64_netscape_cookie(cookies_encoded, cookie_path):
|
||||
try:
|
||||
cookies = base64.b64decode(cookies_encoded).decode("utf-8")
|
||||
except binascii.Error:
|
||||
logger.error("Unable to decode base64 cookie:", cookies_encoded)
|
||||
return
|
||||
|
||||
logger.debug("==== COOKIE FILE ====")
|
||||
for line in cookies.split("\n"):
|
||||
print(line, "=>", len(line.split("\t")))
|
||||
logger.debug("=====================")
|
||||
|
||||
save_cookies(cookies, cookie_path)
|
||||
|
||||
def parser_url_scheme(url, work_dir: Path):
|
||||
logger.debug("Parsing URL scheme:", url)
|
||||
|
||||
url = urllib.parse.urlparse(unquote(sys.argv[1]))
|
||||
parameters = urllib.parse.parse_qs(url.query)
|
||||
|
||||
func_map = {
|
||||
"base64cookies": {
|
||||
"func": save_base64_netscape_cookie,
|
||||
"args": [parameters["base64cookies"][0], work_dir]
|
||||
},
|
||||
}
|
||||
|
||||
for arg_name in parameters:
|
||||
match_func = func_map.get(arg_name, {}).get("func")
|
||||
if match_func:
|
||||
match_func(*func_map[arg_name].get("args", []))
|
||||
else:
|
||||
logger.warning("Unknown parameter:", arg_name, " Value:", parameters[arg_name])
|
||||
|
||||
def save_json(data: dict, dest):
|
||||
try:
|
||||
os.makedirs(os.path.dirname(dest), exist_ok=True)
|
||||
with open(dest, "w", encoding='utf-8') as f:
|
||||
json.dump(data, f, ensure_ascii=False, indent=4)
|
||||
except Exception as e:
|
||||
logger.error("Unable to save json:", e)
|
||||
|
||||
def read_json(path):
|
||||
try:
|
||||
with open(path, "r", encoding='utf-8') as f:
|
||||
return json.load(f)
|
||||
except Exception as e:
|
||||
logger.error("Unable to read json:", e)
|
||||
Reference in New Issue
Block a user