def Conectar(self): streamdecks = DeviceManager().enumerate() # TODO: Cambiar metodo para cargar StreanDeks for index, deck in enumerate(streamdecks): try: self.Deck = deck self.Deck.open() self.Deck.reset() if self.Deck.get_serial_number() == self.Serial: self.Conectado = True self.Cantidad = self.Deck.key_count() Brillo = ObtenerValor("data/streamdeck.json", "brillo") self.Deck.set_brightness(Brillo) self.DeckGif = DeckGif(self.Deck) self.DeckGif.start() self.Deck.set_key_callback(self.ActualizarBoton) return else: self.Deck.close() except TransportError as error: self.Conectado = False self.Deck = None logger.exception(f"Error 1 {error}") except Exception as error: self.Conectado = False self.Deck = None logger.exception(f"Error 2 {error}")
def EstadoOBS(self, Opciones): conectado = ObtenerValor(self.archivoEstado, "obs_conectar") if conectado is None or not conectado: self.Notificar("OBS-No-Conectado") else: self.Notificar("OBS-Conectado") grabando = ObtenerValor(self.archivoEstado, "obs_grabar") if grabando is None or not grabando: self.Notificar("OBS-No-Grabando") else: self.Notificar("OBS-Grabando") enVivo = ObtenerValor(self.archivoEstado, "obs_envivo") if enVivo is None or not enVivo: self.Notificar("OBS-No-EnVivo") else: self.Notificar("OBS-EnVivo")
def __init__(self, Deck): """Carga Configuraciones para usar gif.""" self.Deck = Deck # self.lock = threading.RLock() self.ListaGif = [] self.ListaGifCargar = [] self.Activo = True self.EsperaGif = Fraction( 1, ObtenerValor("data/streamdeck.json", "gif_fps")) self.SiquienteFrame = Fraction(time.monotonic()) super(DeckGif, self).__init__()
def BuscarImagenOBS(NombreAccion, opcionesAccion): Estado = None ListaBasicas = [ "obs_conectar", "obs_grabar", "obs_envivo", ] for Basica in ListaBasicas: if NombreAccion == Basica: Estado = ObtenerValor("data/obs.json", Basica) if NombreAccion == "obs_escena": if "escena" in opcionesAccion: EscenaActual = opcionesAccion["escena"] EscenaActiva = ObtenerValor("data/obs.json", "obs_escena") if EscenaActual == EscenaActiva: Estado = True else: Estado = False elif NombreAccion == "obs_fuente": if "fuente" in opcionesAccion: FuenteActual = opcionesAccion["fuente"] Estado = ObtenerValor("data/obs_fuente.json", FuenteActual) elif NombreAccion == "obs_filtro": if "fuente" in opcionesAccion: Fuente = opcionesAccion["fuente"] if "filtro" in opcionesAccion: Filtro = opcionesAccion["filtro"] if Fuente is not None and Filtro is not None: Estado = ObtenerValor("data/obs_filtro.json", [Fuente, Filtro]) if Estado is None: Estado = False return Estado
def DeckBrillo(self, opciones): Brillo = ObtenerValor("data/streamdeck.json", "brillo") def constrain(n, minn, maxn): return max(min(maxn, n), minn) if "cantidad" in opciones: cantidad = opciones["cantidad"] else: return Brillo += cantidad Brillo = constrain(Brillo, 0, 100) logger.info(f"Deck[Brillo]: {Brillo}") SalvarValor("data/streamdeck.json", "brillo", Brillo) for deck in self.ListaDeck: deck.Brillo(Brillo)
def CambiarFuente(self, opciones=False, Fuente=None): """Envia solisitud de Cambia el estado de una fuente.""" if Fuente is None: if "fuente" in opciones: Fuente = opciones["fuente"] if self.Conectado: Estado = ObtenerValor("data/obs_fuente.json", Fuente) if Estado is not None: Estado = not Estado logger.info(f"OBS[Fuente] {Fuente}={Estado}") self.OBS.call(requests.SetSceneItemProperties(Fuente, visible=Estado)) else: logger.warning(f"No se encontro {Fuente[0]} o {Fuente[1]} en OBS") else: logger.info("OBS[no Conectado]") self.Notificar("OBS No Conectado")
def CargarGif(self, accion): """Extra frame de un gif y los guarda en una lista.""" # TODO: Errro con git con estado no se desactiva if "gif_cargado" in accion: self.ListaGif.append(accion) return DirecionGif = BuscarDirecionImagen(accion) if DirecionGif is not None and not DirecionGif.endswith("gif"): return Gif = list() ColorFondo = "black" if "imagen_opciones" in accion: opciones = accion["imagen_opciones"] if "fondo" in opciones: ColorFondo = opciones["fondo"] DirecionGif = RelativoAbsoluto(DirecionGif, self.Deck.Folder) DirecionGif = UnirPath(ObtenerFolderConfig(), DirecionGif) if os.path.exists(DirecionGif): GifArchivo = Image.open(DirecionGif) for frame in ImageSequence.Iterator(GifArchivo): Gif_frame = PILHelper.create_scaled_image( self.Deck, frame, background=ColorFondo) if "cargar_titulo" in accion: TextoCargar = accion["cargar_titulo"] if "archivo" in TextoCargar and "atributo" in TextoCargar: accion["titulo"] = ObtenerValor( TextoCargar["archivo"], TextoCargar["atributo"]) if "titulo" in accion: PonerTexto(Gif_frame, accion, True) ImagenNativa = PILHelper.to_native_format(self.Deck, Gif_frame) Gif.append(ImagenNativa) accion["gif_cargado"] = itertools.cycle(Gif) self.ListaGif.append(accion) else: logger.warning(f"Deck[No Gifs] {DirecionGif}")
def HiloFuenteArchivo(self): DataEscenaActual = self.OBS.call(requests.GetCurrentScene()).datain Refrescar = False for Fuente in DataEscenaActual["sources"]: NombreFuente = Fuente["name"] EstadoFuente = ObtenerValor("data/obs_fuente.json", NombreFuente, Depurar=False) EstadoFuenteActual = self.OBS.call(requests.GetSceneItemProperties(NombreFuente)).datain if "visible" in EstadoFuenteActual: EstadoFuenteActual = EstadoFuenteActual["visible"] if EstadoFuente is not None: if EstadoFuente != EstadoFuenteActual: self.CambiarFuente(Fuente=NombreFuente) Refrescar = True else: SalvarValor("data/obs_fuente.json", NombreFuente, EstadoFuenteActual) Refrescar = True self.SalvarFiltroFuente(NombreFuente) if Refrescar: self.actualizarDeck()
def IniciarStreamDeck(Datas, FuncionEvento): streamdecks = DeviceManager().enumerate() logger.info( f"Cargando StreamDeck - {len(streamdecks) if len(streamdecks) > 0 else 'No Conectado'}") ListaDeck = [] for Data in Datas: Data['Encontado'] = False for deck in streamdecks: DeckActual = deck DeckActual.open() DeckActual.reset() Brillo = ObtenerValor("data/streamdeck.json", "brillo") DeckActual.set_brightness(Brillo) for Data in Datas: if Data['serial'] == DeckActual.get_serial_number(): logger.info( f"Conectando: {Data['nombre']} - {DeckActual.get_serial_number()}") DeckActual.Serial = DeckActual.get_serial_number() DeckActual.Cantidad = DeckActual.key_count() DeckActual.ID = Data['id'] DeckActual.Nombre = Data['nombre'] DeckActual.File = Data['file'] DeckActual.FuncionEvento = FuncionEvento DeckActual.set_key_callback(ActualizarBoton) ListaDeck.append(DeckActual) Data['encontado'] = True ListaDeck.sort(key=lambda x: x.ID, reverse=False) Cantidad_Base = 0 for deck in ListaDeck: deck.Base = Cantidad_Base Cantidad_Base += deck.Cantidad for Data in Datas: if not Data['encontado']: logger.warning( f"No se encontro: {Data['nombre']} - {Data['serial']}") return ListaDeck
def CambiarFiltro(self, opciones): """Envia solisitud de cambiar estado de filtro.""" Filtro = None Fuente = None if "filtro" in opciones: Filtro = opciones["filtro"] if "fuente" in opciones: Fuente = opciones["fuente"] if Filtro is None or Fuente is None: logger.info("OBS[Falta Atributo]") return if self.Conectado: Estado = ObtenerValor("data/obs_filtro.json", [Fuente, Filtro]) if Estado is not None: Estado = not Estado logger.info(f"OBS[Filtro] {Fuente}[{Filtro}]={Estado}") self.OBS.call(requests.SetSourceFilterVisibility(Fuente, Filtro, Estado)) else: logger.info("OBS[no Conectado]") self.Notificar("OBS No Conectado")
def ActualizarIcono(Deck, indice, accion): global FuenteIcono global ImagenBase global ListaImagenes ColorFondo = "black" imagenFondo = None if "imagen_opciones" in accion: opciones = accion["imagen_opciones"] if "fondo" in opciones: ColorFondo = opciones["fondo"] if "imagen" in opciones: imagenFondo = opciones["imagen"] ImagenBoton = PILHelper.create_image(Deck, background=ColorFondo) if imagenFondo is not None: PonerImagen(ImagenBoton, imagenFondo, accion, Deck.Folder, True) DirecionImagen = BuscarDirecionImagen(accion) if DirecionImagen is not None: if DirecionImagen.endswith(".gif"): # TODO: Meter proceso gif adentro return None PonerImagen(ImagenBoton, DirecionImagen, accion, Deck.Folder) if "cargar_titulo" in accion: TextoCargar = accion["cargar_titulo"] if "archivo" in TextoCargar and "atributo" in TextoCargar: accion["titulo"] = ObtenerValor(TextoCargar["archivo"], TextoCargar["atributo"]) if "titulo" in accion: PonerTexto(ImagenBoton, accion, DirecionImagen) Deck.set_key_image(indice, PILHelper.to_native_format(Deck, ImagenBoton))