python - What is causing this JSONDecodeError?
问题描述
I am trying to setup the itunes Media Player in HASSio. I have the REST API running on my mac, and I am able to pull it up in my browser and see that it is running. From within HA, I am able to adjust the volume and change to the next song, however it will not tell me what is currently playing. the below code is what is output to the log whenever I try and do anything adjust volume, start/stop, forward/reverse.
HASS - 0.84.6
ITUNES - 12.2.1.16
ERROR (MainThread) [homeassistant.components.media_player] Error while setting up platform itunes
Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/homeassistant/helpers/entity_platform.py", line 128, in _async_setup_platform
SLOW_SETUP_MAX_WAIT, loop=hass.loop)
File "/usr/local/lib/python3.6/asyncio/tasks.py", line 358, in wait_for
return fut.result()
File "/usr/local/lib/python3.6/concurrent/futures/thread.py", line 56, in run
result = self.fn(*self.args, **self.kwargs)
File "/usr/local/lib/python3.6/site-packages/homeassistant/components/media_player/itunes.py", line 169, in setup_platform
add_entities
File "/usr/local/lib/python3.6/site-packages/homeassistant/components/media_player/itunes.py", line 199, in __init__
self.update()
File "/usr/local/lib/python3.6/site-packages/homeassistant/components/media_player/itunes.py", line 237, in update
now_playing = self.client.now_playing()
File "/usr/local/lib/python3.6/site-packages/homeassistant/components/media_player/itunes.py", line 92, in now_playing
return self._request('GET', '/now_playing')
File "/usr/local/lib/python3.6/site-packages/homeassistant/components/media_player/itunes.py", line 80, in _request
return response.json()
File "/usr/local/lib/python3.6/site-packages/requests/models.py", line 897, in json
return complexjson.loads(self.text, **kwargs)
File "/usr/local/lib/python3.6/site-packages/simplejson/__init__.py", line 518, in loads
return _default_decoder.decode(s)
File "/usr/local/lib/python3.6/site-packages/simplejson/decoder.py", line 370, in decode
obj, end = self.raw_decode(s)
File "/usr/local/lib/python3.6/site-packages/simplejson/decoder.py", line 400, in raw_decode
return self.scan_once(s, idx=_w(s, idx).end())
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Here is Lines 66-171 of itunes.py
def _request(self, method, path, params=None):
"""Make the actual request and return the parsed response."""
url = '{}{}'.format(self._base_url, path)
try:
if method == 'GET':
response = requests.get(url, timeout=DEFAULT_TIMEOUT)
elif method == 'POST':
response = requests.put(url, params, timeout=DEFAULT_TIMEOUT)
elif method == 'PUT':
response = requests.put(url, params, timeout=DEFAULT_TIMEOUT)
elif method == 'DELETE':
response = requests.delete(url, timeout=DEFAULT_TIMEOUT)
return response.json()
except requests.exceptions.HTTPError:
return {'player_state': 'error'}
except requests.exceptions.RequestException:
return {'player_state': 'offline'}
def _command(self, named_command):
"""Make a request for a controlling command."""
return self._request('PUT', '/' + named_command)
def now_playing(self):
"""Return the current state."""
return self._request('GET', '/now_playing')
def set_volume(self, level):
"""Set the volume and returns the current state, level 0-100."""
return self._request('PUT', '/volume', {'level': level})
def set_muted(self, muted):
"""Mute and returns the current state, muted True or False."""
return self._request('PUT', '/mute', {'muted': muted})
def play(self):
"""Set playback to play and returns the current state."""
return self._command('play')
def pause(self):
"""Set playback to paused and returns the current state."""
return self._command('pause')
def next(self):
"""Skip to the next track and returns the current state."""
return self._command('next')
def previous(self):
"""Skip back and returns the current state."""
return self._command('previous')
def stop(self):
"""Stop playback and return the current state."""
return self._command('stop')
def play_playlist(self, playlist_id_or_name):
"""Set a playlist to be current and returns the current state."""
response = self._request('GET', '/playlists')
playlists = response.get('playlists', [])
found_playlists = \
[playlist for playlist in playlists if
(playlist_id_or_name in [playlist["name"], playlist["id"]])]
if found_playlists:
playlist = found_playlists[0]
path = '/playlists/' + playlist['id'] + '/play'
return self._request('PUT', path)
def artwork_url(self):
"""Return a URL of the current track's album art."""
return self._base_url + '/artwork'
def airplay_devices(self):
"""Return a list of AirPlay devices."""
return self._request('GET', '/airplay_devices')
def airplay_device(self, device_id):
"""Return an AirPlay device."""
return self._request('GET', '/airplay_devices/' + device_id)
def toggle_airplay_device(self, device_id, toggle):
"""Toggle airplay device on or off, id, toggle True or False."""
command = 'on' if toggle else 'off'
path = '/airplay_devices/' + device_id + '/' + command
return self._request('PUT', path)
def set_volume_airplay_device(self, device_id, level):
"""Set volume, returns current state of device, id,level 0-100."""
path = '/airplay_devices/' + device_id + '/volume'
return self._request('PUT', path, {'level': level})
def setup_platform(hass, config, add_entities, discovery_info=None):
"""Set up the iTunes platform."""
add_entities([
ItunesDevice(
config.get(CONF_NAME),
config.get(CONF_HOST),
config.get(CONF_PORT),
config.get(CONF_SSL),
add_entities
)
])
解决方案
Mac OS Sierra 只安装了 Python 2.XX。升级到 Python 3.6X 似乎可以正常工作。
推荐阅读
- python - 如何在 re.findall 中使用变量?
- r - ggplot2,如何移动直方图?
- java - 如何从 Java 中的 CSV 文件中查找素数?
- delphi - Sybase:使用 Delphi 和 Firedac 访问表时出错
- laravel - 通过 PostCSS (Laravel Mix) 构建 Tailwind 时的奇怪输出
- html - 影响其他尺寸的响应式变化
- popup - Windows 上的 Netlogo - GUI 中的弹出窗口在屏幕之外打开并且无法关闭
- scala - 如何在 Scalatest 中为异步套件设置超时?
- javascript - testcafe 选择器找不到“div”元素
- java - 使用 Scala-2.13 将 Java 映射转换为 Java 代码中的 Scala 不可变映射