Fix vlc_telnet state update (#46628)

* Clean up

* Add debug logs

* Fix info lookup

* Handle more errors

* Guard get length and time
This commit is contained in:
Martin Hjelmare 2021-02-16 15:48:06 +01:00 committed by GitHub
parent 9d8ba6af96
commit f0e9ef421c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,7 +1,13 @@
"""Provide functionality to interact with the vlc telnet interface.""" """Provide functionality to interact with the vlc telnet interface."""
import logging import logging
from python_telnet_vlc import ConnectionError as ConnErr, VLCTelnet from python_telnet_vlc import (
CommandError,
ConnectionError as ConnErr,
LuaError,
ParseError,
VLCTelnet,
)
import voluptuous as vol import voluptuous as vol
from homeassistant.components.media_player import PLATFORM_SCHEMA, MediaPlayerEntity from homeassistant.components.media_player import PLATFORM_SCHEMA, MediaPlayerEntity
@ -82,7 +88,6 @@ class VlcDevice(MediaPlayerEntity):
def __init__(self, name, host, port, passwd): def __init__(self, name, host, port, passwd):
"""Initialize the vlc device.""" """Initialize the vlc device."""
self._instance = None
self._name = name self._name = name
self._volume = None self._volume = None
self._muted = None self._muted = None
@ -94,7 +99,7 @@ class VlcDevice(MediaPlayerEntity):
self._port = port self._port = port
self._password = passwd self._password = passwd
self._vlc = None self._vlc = None
self._available = False self._available = True
self._volume_bkp = 0 self._volume_bkp = 0
self._media_artist = "" self._media_artist = ""
self._media_title = "" self._media_title = ""
@ -104,43 +109,54 @@ class VlcDevice(MediaPlayerEntity):
if self._vlc is None: if self._vlc is None:
try: try:
self._vlc = VLCTelnet(self._host, self._password, self._port) self._vlc = VLCTelnet(self._host, self._password, self._port)
self._state = STATE_IDLE except (ConnErr, EOFError) as err:
self._available = True if self._available:
except (ConnErr, EOFError): _LOGGER.error("Connection error: %s", err)
self._available = False self._available = False
self._vlc = None self._vlc = None
else: return
try:
status = self._vlc.status() self._state = STATE_IDLE
if status: self._available = True
if "volume" in status:
self._volume = int(status["volume"]) / 500.0 try:
else: status = self._vlc.status()
self._volume = None _LOGGER.debug("Status: %s", status)
if "state" in status:
state = status["state"] if status:
if state == "playing": if "volume" in status:
self._state = STATE_PLAYING self._volume = int(status["volume"]) / 500.0
elif state == "paused": else:
self._state = STATE_PAUSED self._volume = None
else: if "state" in status:
self._state = STATE_IDLE state = status["state"]
if state == "playing":
self._state = STATE_PLAYING
elif state == "paused":
self._state = STATE_PAUSED
else: else:
self._state = STATE_IDLE self._state = STATE_IDLE
else:
self._state = STATE_IDLE
if self._state != STATE_IDLE:
self._media_duration = self._vlc.get_length() self._media_duration = self._vlc.get_length()
self._media_position = self._vlc.get_time() self._media_position = self._vlc.get_time()
info = self._vlc.info() info = self._vlc.info()
if info: _LOGGER.debug("Info: %s", info)
self._media_artist = info[0].get("artist")
self._media_title = info[0].get("title")
except (ConnErr, EOFError): if info:
self._media_artist = info.get(0, {}).get("artist")
self._media_title = info.get(0, {}).get("title")
except (CommandError, LuaError, ParseError) as err:
_LOGGER.error("Command error: %s", err)
except (ConnErr, EOFError) as err:
if self._available:
_LOGGER.error("Connection error: %s", err)
self._available = False self._available = False
self._vlc = None self._vlc = None
return True
@property @property
def name(self): def name(self):