Generar un código QR

  • Autor Autor Miembro eliminado 22877
  • Fecha de inicio Fecha de inicio
M

Miembro eliminado 22877

Invitado
En mi dispositivo AndroidTV no hay un navegador compatible con el método call_browser (que se usa para abrir enlaces web), me preguntaba que opinan de generar un código QR como último recurso en aquellos dispositivos, como el mío, en los que call_browser no encuentre un navegador.

Esto lo pregunto antes de indagar en si es o no posible. No quisiera profundizar mas antes de saber si esto se ha planteado y descartado anteriormente.
 
Upvote 0
Según la situación, es plausible esto. Si es un enlace para consulta sería posible. Pero para escenarios como abrir un sitio para descargar un Torrent pues no tiene mucho sentido.

Sería cuestión de hacer el IU y usar alguna librería de Python que genere los QRs.

En cuanto a tu problema en particular, creo que amerita revisar ese método, porque recuerdo un método integrado de Python que permite llamar al navegador por defecto y que no se utiliza actualmente en la función call_browser.

Pensando incluso más allá, podría utilizarse el QR para mostrar los enlaces a los logs, al menos aquellos que no se borran tras el primer acceso.
 
Bueno, pues así, a modo experimental, para probar vamos... he añadido la librería qrcode, la cual requiere pypng y typing-extensions y requieren python 3.7+, de lo que me he dado cuenta tarde, aunque hay otra que funciona con python 2 (aparentemente) PyQRCode.
Aunque he estado mirando el codigo de nextep.py, y leyendo algunos artículos al respecto (GUI_tutorial, python xbmcgui window dialog xml), aun no me he atrevido con la interfaz, así que he hecho uso de un método mas básico.
To view this content we will need your consent to set third party cookies.
For more detailed information, see our cookies page.

PS: Con PyQRCode y una version antigua de pypng (0.17, ya que la ultima solo funciona con 3.5+) funciona bien en Kodi 18 y en 20.
 
Última edición por un moderador:
¡Se ve genial! Me agrada la implementación, es simple y directa. Podrías mover el código del QR y de la ventana a por ejemplo platformtools a una función tipo dialog_qr_message(heading, message, url) por poner un ejemplo, para poder utilizarlo en cualquier parte en el add-on.

Puedes revisar este enlace: Files...
La biblioteca qrcode está disponible al menos desde Kodi Isengard. Podría importarse desde el xml del add-on o integrar el código directo en /lib, y en el caso de pypng se puede utilizar la versión antigua que enlazaste.

Para el GUI, puedes ver renumbertools.py en la clase RenumberWindow que utiliza xbmcgui.WindowDialog para que te des una idea "por encima" de cómo crear una ventana. El principal reto es familiarizarse un poco con los conceptos de controles que se manejan con los GUIs, y acomodarlos para que queden estéticos :fresco:. A diferencia de WindowDialogXML, en esta clase tú defines la ventana manualmente desde el código, mientras que en la otra la defines en un archivo XML que se pone en resources.

Cabe mencionar que gran parte del código del GUI en Alfa está desactualizado respecto a Matrix, así que hay algunas funciones que, válgase la redundancia, funcionan diferente y parecen estar rotas en algunos casos. Haz tus pruebas y revisa la documentación de Kodi para corroborar.
 
Bueno, de momento he movido el código, a ver si me aclaro con el GUI y puedo sacar algo medio decente. :D

Por otro lado no tengo idea de como se importa el código desde otro addon, yo simplemente me los he bajado de pypi.org y los he metido en lib.
¿Me podrías decir alguna parte del código que me pueda servir de ejemplo, por favor?

He usado strings localizados que ya existen, supongo que habrá que añadir alguno.

generictools.py 3438
Python:
            else:
                # Si no se ha encontrado ningún browser que cumpla las condiciones, se vuelve con error
                if lookup:
                    return ('QRCODE', False)
                else:
                    from platformcode.platformtools import dialog_qr_message
                    if dialog_qr_message(config.get_localized_string(70759), config.get_localized_string(70281), url):
                        return ('QRCODE', False)
platformtools.py 146 (después de dialog_browse que es la última dialog_*)
Python:
def dialog_qr_message(heading="", message="", qrdata=""):
    from core import filetools
    import pyqrcode
    import pyqrcode.tables

    try:
        temp_folder = filetools.translatePath('special://temp')
    except:
        logger.error('No se pudo hubicar una carpeta temporal.')
        return False

    if not filetools.exists(temp_folder):
        logger.error('No existe la carpeta temporal %s.' % temp_folder)
        return False

    file_path = filetools.join(temp_folder, 'qr.png')

    try:
        qr = pyqrcode.create(qrdata)
        qr.png(file_path, scale=6, module_color='#000', background='#fff')
    except:
        logger.error('No se pudo generar el código QR')
        return False

    if filetools.exists(file_path):
        dialog_ok(heading, message)
        try:
            xbmc.executebuiltin('ShowPicture("%s")' % file_path)
        except:
            logger.error('Hubo un error al mostrar la imagen del QR: %s' % file_path)
            return False

        # try:
            # filetools.remove(file_path, vfs=False)
        # except:
            # logger.error('Hubo un error al eliminar la imagen QR generada: %s' % file_path)
    else:
        logger.error('No se guardó la imagen generada para el código QR')
        return False

    return True
 
Por otro lado no tengo idea de como se importa el código desde otro addon, yo simplemente me los he bajado de pypi.org y los he metido en lib.
¿Me podrías decir alguna parte del código que me pueda servir de ejemplo, por favor?

Bueno, mi impaciencia me ha ganado, al final he rebuscado en el código y he hecho una función para que compruebe si esta instalado tomando prestado de otro:

Python:
def check_addon(addon_name_py2, addon_name_py3 = ""):
    if addon_name_py3 == "": addon_name_py3 = addon_name_py2
    addon_name = addon_name_py3 if PY3 else addon_name_py2
    continuar = True
    if not xbmc.getCondVisibility('System.HasAddon(%s)' % addon_name):
        continuar = False
        try:
            xbmc.executebuiltin('InstallAddon(%s)' % addon_name, True)
            if xbmc.getCondVisibility('System.HasAddon(%s)' % addon_name):
                continuar = True
        except:
            pass

        if not continuar:
            return False
    if continuar:
        #xbmc.executebuiltin('Addon.OpenSettings(%s)' % addon_name, True)
        return True

Despues he agregado esta linea a Addon.xml:

Python:
<import addon="script.module.pyqrcode" optional="true"></import>

Y ya lo tengo todo funcionando :)

QR.jpg
 
Última edición por un moderador:
Diste en el clavo. Básicamente es poner en addon.xml el módulo de Kodi que quieres importar, y ya simplemente lo importas.

Puedes eliminar el optional="true" para que sea obligatorio instalarlo junto con Alfa y no debas asegurarte de que esté instalado.
 
Ah, pues sería mas sencillo, como lo hago ahora sale un cartel preguntando al usuario si quiere instalar el módulo al clicar.

Pero, me pregunto, al no estar disponible antes de jarvis, no sería mas compatible dejarlo opcional, al fin y al cabo es una funcionalidad menor que en la mayoría de los casos no se va a utilizar si existe un navegador compatible.
Aunque se podría querer usar para otros menesteres en un futuro. No se... :rolleyes:
 
Ah, pues sería mas sencillo, como lo hago ahora sale un cartel preguntando al usuario si quiere instalar el módulo al clicar.

Pero, me pregunto, al no estar disponible antes de jarvis, no sería mas compatible dejarlo opcional, al fin y al cabo es una funcionalidad menor que en la mayoría de los casos no se va a utilizar si existe un navegador compatible.
Aunque se podría querer usar para otros menesteres en un futuro. No se... :rolleyes:
Pues me parece que Alfa apenas si funciona en Krypton, así que en cuanto compatibilidad no necesitas irte demasiadas versiones atrás
 
Atrás
Arriba