from os import path
import xbmcgui
import xbmcvfs
from lib.jacktook.utils import ADDON_PATH, kodilog
from lib.utils.kodi.utils import ADDON_PROFILE_PATH
from lib.vendor.segno import make as segnomake
def make_qrcode(url):
if not url:
return
try:
if not path.exists(ADDON_PROFILE_PATH):
xbmcvfs.mkdir(ADDON_PROFILE_PATH)
art_path = path.join(ADDON_PROFILE_PATH, "qr.png")
kodilog(f"Creating QR code for URL: {art_path}")
qrcode = segnomake(url, micro=False)
qrcode.save(art_path, scale=20)
return art_path
except Exception as e:
kodilog("Error creating QR code: %s", e)
class QRProgressDialogLib(xbmcgui.WindowDialog):
def __init__(self, title, qr_path, auth_url, user_code):
super().__init__()
# Use skin base res (Kodi scales this to actual screen)
screen_w, screen_h = 1280, 720
box_w, box_h = 600, 400
box_x = (screen_w - box_w) // 2 # 340
box_y = (screen_h - box_h) // 2 # 160
# Background
self.bg = xbmcgui.ControlImage(
box_x,
box_y,
box_w,
box_h,
path.join(ADDON_PATH, "resources", "img", "texture.png"),
)
self.addControl(self.bg)
# Title
self.title_lbl = xbmcgui.ControlLabel(
box_x + 20, box_y + 20, box_w - 40, 30, f"[B]{title}[/B]"
)
self.addControl(self.title_lbl)
# QR
self.qr = xbmcgui.ControlImage(box_x + 30, box_y + 70, 200, 200, qr_path)
self.addControl(self.qr)
# Instructions
self.text_lbl = xbmcgui.ControlLabel(
box_x + 250,
box_y + 70,
box_w - 280,
120,
f"Go to:\n[COLOR cyan]{auth_url}[/COLOR]\n\n"
f"Enter code:\n[COLOR seagreen][B]{user_code}[/B][/COLOR]",
)
self.addControl(self.text_lbl)
# Progress bar
self.progress = xbmcgui.ControlProgress(box_x + 20, box_y + 300, box_w - 40, 30)
self.addControl(self.progress)
# Cancel button
self.cancel_btn = xbmcgui.ControlButton(
box_x + box_w - 140, box_y + box_h - 40, 120, 30, "Cancel"
)
self.addControl(self.cancel_btn)
def setProgress(self, percent, message=""):
self.progress.setPercent(percent)
if message:
self.text_lbl.setLabel(message)
def isCanceled(self):
return self.getFocusId() == self.cancel_btn.getId()