是什么导致此JSONDecodeError?

时间:2018-12-30 20:52:47

标签: python json python-3.x itunes simplejson

我正在尝试在HASSio中设置iTunes Media Player。我的REST API在我的Mac上运行,并且能够在浏览器中将其拉出并看到它正在运行。在HA内,我可以调节音量并切换到下一首歌曲,但是它不会告诉我当前正在播放什么。下面的代码是我每次尝试进行任何调整音量,开始/停止,前进/后退时都会输出到日志的内容。

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)

这是itunes.py的66-171行

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
    )
])

1 个答案:

答案 0 :(得分:-1)

Mac OS Sierra仅安装了Python2.XX。升级到Python 3.6X似乎可以正常工作。