diff --git a/mopidy_spotify/images.py b/mopidy_spotify/images.py
index 01adf2c..7dec2d8 100644
--- a/mopidy_spotify/images.py
+++ b/mopidy_spotify/images.py
@@ -15,7 +15,8 @@ logger = logging.getLogger(__name__)
 def get_images(web_client, uris):
     result = {}
     uri_type_getter = operator.itemgetter("type")
-    uris = sorted((_parse_uri(u) for u in uris), key=uri_type_getter)
+    uris = (_parse_uri(u) for u in uris)
+    uris = sorted((u for u in uris if u), key=uri_type_getter)
     for uri_type, group in itertools.groupby(uris, uri_type_getter):
         batch = []
         for uri in group:
@@ -33,25 +34,27 @@ def get_images(web_client, uris):
 
 
 def _parse_uri(uri):
-    parsed_uri = urllib.parse.urlparse(uri)
-    uri_type, uri_id = None, None
-
-    if parsed_uri.scheme == "spotify":
-        uri_type, uri_id = parsed_uri.path.split(":")[:2]
-    elif parsed_uri.scheme in ("http", "https"):
-        if parsed_uri.netloc in ("open.spotify.com", "play.spotify.com"):
-            uri_type, uri_id = parsed_uri.path.split("/")[1:3]
-
-    supported_types = ("track", "album", "artist", "playlist")
-    if uri_type and uri_type in supported_types and uri_id:
-        return {
-            "uri": uri,
-            "type": uri_type,
-            "id": uri_id,
-            "key": (uri_type, uri_id),
-        }
-
-    raise ValueError(f"Could not parse {repr(uri)} as a Spotify URI")
+    try:
+        parsed_uri = urllib.parse.urlparse(uri)
+        uri_type, uri_id = None, None
+
+        if parsed_uri.scheme == "spotify":
+            uri_type, uri_id = parsed_uri.path.split(":")[:2]
+        elif parsed_uri.scheme in ("http", "https"):
+            if parsed_uri.netloc in ("open.spotify.com", "play.spotify.com"):
+                uri_type, uri_id = parsed_uri.path.split("/")[1:3]
+
+        supported_types = ("track", "album", "artist", "playlist")
+        if uri_type and uri_type in supported_types and uri_id:
+            return {
+                "uri": uri,
+                "type": uri_type,
+                "id": uri_id,
+                "key": (uri_type, uri_id),
+            }
+        raise ValueError("Unknown error")
+    except Exception as e:
+        logger.exception(f"Could not parse {repr(uri)} as a Spotify URI ({e})")
 
 
 def _process_uri(web_client, uri):
@@ -80,7 +83,10 @@ def _process_uris(web_client, uri_type, uris):
 
         if uri["key"] not in _cache:
             if uri_type == "track":
-                album_key = _parse_uri(item["album"]["uri"])["key"]
+                album = _parse_uri(item["album"]["uri"])
+                if not album:
+                    continue
+                album_key = album["key"]
                 if album_key not in _cache:
                     _cache[album_key] = tuple(
                         _translate_image(i) for i in item["album"]["images"]
diff --git a/mopidy_spotify/web.py b/mopidy_spotify/web.py
index a937d06..b5ebea5 100644
--- a/mopidy_spotify/web.py
+++ b/mopidy_spotify/web.py
@@ -196,7 +196,7 @@ class OAuthClient:
 
             # Decide how long to sleep in the next iteration.
             backoff_time = backoff_time or (2**i * self._backoff_factor)
-            logger.debug(
+            logger.error(
                 f"Retrying {prepared_request.url} in {backoff_time:.3f} "
                 "seconds."
             )
diff --git a/tox.ini b/tox.ini
index 209e644..a5ad7c1 100644
--- a/tox.ini
+++ b/tox.ini
@@ -5,7 +5,7 @@ envlist = py39, py310, py311, check-manifest, flake8
 sitepackages = true
 deps = .[test]
 commands =
-    python -m pytest \
+    python -m pytest -vv \
         --basetemp={envtmpdir} \
         --cov=mopidy_spotify --cov-report=term-missing \
         {posargs}

diff --git a/tests/test_images.py b/tests/test_images.py
index 0ead783..cc67e9a 100644
--- a/tests/test_images.py
+++ b/tests/test_images.py
@@ -127,6 +127,27 @@ def test_get_track_images(web_client_mock, img_provider):
     assert image.width == 640
 
 
+def test_get_track_images_bad_album_uri(web_client_mock, img_provider):
+    uris = ["spotify:track:41shEpOKyyadtG6lDclooa"]
+
+    web_client_mock.get.return_value = {
+        "tracks": [
+            {
+                "id": "41shEpOKyyadtG6lDclooa",
+                "album": {
+                    "uri": "spotify:bad-data",
+                    "images": [
+                        {"height": 640, "url": "img://1/a", "width": 640}
+                    ],
+                },
+            }
+        ]
+    }
+
+    result = img_provider.get_images(uris)
+    assert result == {}
+
+
 def test_get_relinked_track_images(web_client_mock, img_provider):
     uris = ["spotify:track:4nqN0p0FjfH39G3hxeuKad"]
 
@@ -167,7 +188,7 @@ def test_get_relinked_track_images(web_client_mock, img_provider):
 
 
 def test_get_playlist_image(web_client_mock, img_provider):
-    uris = ["spotify:playlist:41shEpOKyyadtG6lDclooa"]
+    uris = ["spotify:playlist:41shEpOKyyadtG6lDclooa", "foo:bar"]
 
     web_client_mock.get.return_value = {
         "id": "41shEpOKyyadtG6lDclooa",
@@ -181,7 +202,7 @@ def test_get_playlist_image(web_client_mock, img_provider):
     )
 
     assert len(result) == 1
-    assert sorted(result.keys()) == sorted(uris)
+    assert sorted(result.keys()) == ["spotify:playlist:41shEpOKyyadtG6lDclooa"]
     assert len(result[uris[0]]) == 1
 
     image = result[uris[0]][0]
@@ -231,11 +252,11 @@ def test_max_50_ids_per_request(web_client_mock, img_provider):
     assert request_ids_2 == "50"
 
 
-def test_invalid_uri_fails(img_provider):
-    with pytest.raises(ValueError) as exc:
-        img_provider.get_images(["foo:bar"])
-
-    assert str(exc.value) == "Could not parse 'foo:bar' as a Spotify URI"
+def test_invalid_uri(img_provider, caplog):
+    with caplog.at_level(5):
+        result = img_provider.get_images(["foo:bar"])
+    assert result == {}
+    assert "Could not parse 'foo:bar' as a Spotify URI" in caplog.text
 
 
 def test_no_uris_gives_no_results(img_provider):
diff --git a/tests/test_web.py b/tests/test_web.py
index 90358aa..e589f1d 100644
--- a/tests/test_web.py
+++ b/tests/test_web.py
@@ -620,9 +620,7 @@ def test_cache_normalised_query_string(
     assert "tracks/abc?b=bar&f=cat" in cache
 
 
-@pytest.mark.parametrize(
-    "status,expected", [(304, "spotify:track:abc"), (200, "spotify:track:xyz")]
-)
+@pytest.mark.parametrize("status,unchanged", [(304, True), (200, False)])
 @responses.activate
 def test_cache_expired_with_etag(
     web_response_mock_etag,
@@ -630,23 +628,24 @@ def test_cache_expired_with_etag(
     skip_refresh_token,
     oauth_client,
     status,
-    expected,
+    unchanged,
+    caplog,
 ):
     cache = {"tracks/abc": web_response_mock_etag}
     responses.add(
         responses.GET,
         "https://api.spotify.com/v1/tracks/abc",
-        json={"uri": "spotify:track:xyz"},
         status=status,
     )
-    mock_time.return_value = 1001
+    mock_time.return_value = web_response_mock_etag._expires + 1
     assert not cache["tracks/abc"].still_valid()
 
     result = oauth_client.get("tracks/abc", cache)
     assert len(responses.calls) == 1
     assert responses.calls[0].request.headers["If-None-Match"] == '"1234"'
-    assert result["uri"] == expected
     assert cache["tracks/abc"] == result
+    assert result.status_unchanged is unchanged
+    assert (result.items() == web_response_mock_etag.items()) == unchanged
 
 
 @responses.activate

Browsing in Spotify Library doesn't work
Hey, 

im getting an error when browsing Spotify via Iris Webbrowser:

INFO     2023-10-19 13:01:03,083 [9405:SpotifyBackend-6 (_actor_loop)] mopidy_spotify.lookup
  Failed to lookup 'spotify:directory': Could not parse 'spotify:directory' as a Spotify URI
ERROR    2023-10-19 13:01:03,116 [9405:Core-8 (_actor_loop)] mopidy.core.library
  SpotifyBackend backend caused an exception.
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/dist-packages/mopidy/core/library.py", line 17, in _backend_error_handling
    yield
  File "/usr/local/lib/python3.11/dist-packages/mopidy/core/library.py", line 194, in get_images
    if future.get() is None:
       ^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/pykka/_threading.py", line 68, in get
    raise exc_value
  File "/usr/local/lib/python3.11/dist-packages/pykka/_actor.py", line 238, in _actor_loop_running
    response = self._handle_receive(envelope.message)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/pykka/_actor.py", line 349, in _handle_receive
    return callee(*message.args, **message.kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/mopidy_spotify/library.py", line 35, in get_images
    return images.get_images(self._backend._web_client, uris)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/mopidy_spotify/images.py", line 18, in get_images
    uris = sorted((_parse_uri(u) for u in uris), key=uri_type_getter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/mopidy_spotify/images.py", line 18, in <genexpr>
    uris = sorted((_parse_uri(u) for u in uris), key=uri_type_getter)
                   ^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/mopidy_spotify/images.py", line 40, in _parse_uri
    uri_type, uri_id = parsed_uri.path.split(":")[:2]
    ^^^^^^^^^^^^^^^^
ValueError: not enough values to unpack (expected 2, got 1)
ERROR    2023-10-19 13:01:03,135 [9405:Core-8 (_actor_loop)] mopidy.core.library
  SpotifyBackend backend caused an exception.
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/dist-packages/mopidy/core/library.py", line 17, in _backend_error_handling
    yield
  File "/usr/local/lib/python3.11/dist-packages/mopidy/core/library.py", line 194, in get_images
    if future.get() is None:
       ^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/pykka/_threading.py", line 68, in get
    raise exc_value
  File "/usr/local/lib/python3.11/dist-packages/pykka/_actor.py", line 238, in _actor_loop_running
    response = self._handle_receive(envelope.message)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/pykka/_actor.py", line 349, in _handle_receive
    return callee(*message.args, **message.kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/mopidy_spotify/library.py", line 35, in get_images
    return images.get_images(self._backend._web_client, uris)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/mopidy_spotify/images.py", line 18, in get_images
    uris = sorted((_parse_uri(u) for u in uris), key=uri_type_getter)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/mopidy_spotify/images.py", line 18, in <genexpr>
    uris = sorted((_parse_uri(u) for u in uris), key=uri_type_getter)
                   ^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/mopidy_spotify/images.py", line 40, in _parse_uri
    uri_type, uri_id = parsed_uri.path.split(":")[:2]
    ^^^^^^^^^^^^^^^^
ValueError: not enough values to unpack (expected 2, got 1)

the requested URI is:
spotify:directory

tests/test_images.py::test_get_track_images_bad_album_uri tests/test_images.py::test_get_playlist_image tests/test_images.py::test_invalid_uri
tests/test_images.py::test_get_artist_images tests/test_images.py::test_get_album_images tests/test_images.py::test_get_track_images tests/test_images.py::test_get_relinked_track_images tests/test_images.py::test_results_are_cached tests/test_images.py::test_max_50_ids_per_request tests/test_images.py::test_no_uris_gives_no_results tests/test_images.py::test_service_returns_empty_result tests/test_web.py::test_initial_refresh_token tests/test_web.py::test_expired_refresh_token tests/test_web.py::test_still_valid_refresh_token tests/test_web.py::test_user_agent tests/test_web.py::test_parse_retry_after[None-0] tests/test_web.py::test_parse_retry_after[-0] tests/test_web.py::test_parse_retry_after[1-1] tests/test_web.py::test_parse_retry_after[-1-0] tests/test_web.py::test_parse_retry_after[ tests/test_web.py::test_parse_retry_after[2 tests/test_web.py::test_parse_retry_after[foo-0] tests/test_web.py::test_parse_retry_after[Wed, tests/test_web.py::test_parse_retry_after[foobar-0] tests/test_web.py::test_request_exception tests/test_web.py::test_get_uses_new_access_token tests/test_web.py::test_get_uses_existing_access_token tests/test_web.py::test_bad_client_credentials tests/test_web.py::test_auth_returns_invalid_json tests/test_web.py::test_spotify_returns_invalid_json tests/test_web.py::test_auth_offline tests/test_web.py::test_spotify_offline tests/test_web.py::test_auth_missing_access_token tests/test_web.py::test_auth_wrong_token_type tests/test_web.py::test_parse_cache_control[no-store-100] tests/test_web.py::test_parse_cache_control[max-age=1-101] tests/test_web.py::test_parse_cache_control[max-age=2000-2100] tests/test_web.py::test_parse_cache_control[max-age=2000, tests/test_web.py::test_parse_cache_control[stuff, tests/test_web.py::test_parse_cache_control[max-age=junk-100] tests/test_web.py::test_parse_cache_control[-100] tests/test_web.py::test_parse_etag[-None] tests/test_web.py::test_parse_etag[" tests/test_web.py::test_parse_etag[33a6ff-None] tests/test_web.py::test_parse_etag["33a6ff"-"33a6ff"] tests/test_web.py::test_parse_etag["33"a6ff"-None] tests/test_web.py::test_parse_etag["33\na6ff"-None] tests/test_web.py::test_parse_etag[W/"33a6ff"-"33a6ff"] tests/test_web.py::test_parse_etag["#aa44-cc1-23==@!"-"#aa44-cc1-23==@!"] tests/test_web.py::test_web_response_status_ok[200-True] tests/test_web.py::test_web_response_status_ok[301-True] tests/test_web.py::test_web_response_status_ok[400-False] tests/test_web.py::test_web_response_status_unchanged[200-False] tests/test_web.py::test_web_response_status_unchanged[301-False] tests/test_web.py::test_web_response_status_unchanged[304-True] tests/test_web.py::test_web_response_status_unchanged[400-False] tests/test_web.py::test_web_response_status_unchanged_from_cache tests/test_web.py::test_web_response_etag_headers["1234"-expected0] tests/test_web.py::test_web_response_etag_headers[fish-expected1] tests/test_web.py::test_web_response_etag_headers[None-expected2] tests/test_web.py::test_web_response_etag_updated[abcd-200-False-abcd-ETag tests/test_web.py::test_web_response_etag_updated[abcd-404-False-abcd-ETag tests/test_web.py::test_web_response_etag_updated[abcd-304-True-efgh-ETag tests/test_web.py::test_web_response_etag_updated[None-304-False-None-] tests/test_web.py::test_web_response_etag_updated_different tests/test_web.py::test_should_cache_response[None-False-False] tests/test_web.py::test_should_cache_response[None-True-False] tests/test_web.py::test_should_cache_response[cache2-False-False] tests/test_web.py::test_should_cache_response[cache3-True-True] tests/test_web.py::test_normalise_query_string[tracks/abc?foo=bar&foo=5-None-tracks/abc?foo=5] tests/test_web.py::test_normalise_query_string[tracks/abc?foo=bar&bar=9-None-tracks/abc?bar=9&foo=bar] tests/test_web.py::test_normalise_query_string[tracks/abc-params2-tracks/abc?foo=bar] tests/test_web.py::test_normalise_query_string[tracks/abc?foo=bar-params3-tracks/abc?bar=foo&foo=bar] tests/test_web.py::test_normalise_query_string[tracks/abc?foo=bar-params4-tracks/abc?foo=foo] tests/test_web.py::test_web_response tests/test_web.py::test_cache_miss tests/test_web.py::test_cache_response_still_valid tests/test_web.py::test_cache_response_expired tests/test_web.py::test_cache_response_ignore_expiry tests/test_web.py::test_dont_cache_bad_status tests/test_web.py::test_cache_key_uses_path tests/test_web.py::test_cache_normalised_query_string tests/test_web.py::test_cache_expired_with_etag[304-True] tests/test_web.py::test_cache_expired_with_etag[200-False] tests/test_web.py::test_cache_miss_no_etag tests/test_web.py::test_increase_expiry tests/test_web.py::test_increase_expiry_skipped_for_bad_status tests/test_web.py::test_increase_expiry_skipped_for_cached_response tests/test_web.py::test_fresh_response_changed tests/test_web.py::test_cached_response_unchanged tests/test_web.py::test_updated_responses_changed tests/test_web.py::TestSpotifyOAuthClient::test_track_required_fields[next] tests/test_web.py::TestSpotifyOAuthClient::test_track_required_fields[items(track] tests/test_web.py::TestSpotifyOAuthClient::test_track_required_fields[type] tests/test_web.py::TestSpotifyOAuthClient::test_track_required_fields[uri] tests/test_web.py::TestSpotifyOAuthClient::test_track_required_fields[name] tests/test_web.py::TestSpotifyOAuthClient::test_track_required_fields[is_playable] tests/test_web.py::TestSpotifyOAuthClient::test_track_required_fields[linked_from] tests/test_web.py::TestSpotifyOAuthClient::test_playlist_required_fields[name0] tests/test_web.py::TestSpotifyOAuthClient::test_playlist_required_fields[type] tests/test_web.py::TestSpotifyOAuthClient::test_playlist_required_fields[uri] tests/test_web.py::TestSpotifyOAuthClient::test_playlist_required_fields[name1] tests/test_web.py::TestSpotifyOAuthClient::test_playlist_required_fields[snapshot_id] tests/test_web.py::TestSpotifyOAuthClient::test_playlist_required_fields[tracks] tests/test_web.py::TestSpotifyOAuthClient::test_configures_auth tests/test_web.py::TestSpotifyOAuthClient::test_configures_proxy tests/test_web.py::TestSpotifyOAuthClient::test_configures_urls tests/test_web.py::TestSpotifyOAuthClient::test_login_alice tests/test_web.py::TestSpotifyOAuthClient::test_login_fails tests/test_web.py::TestSpotifyOAuthClient::test_get_one_error tests/test_web.py::TestSpotifyOAuthClient::test_get_one_cached tests/test_web.py::TestSpotifyOAuthClient::test_get_one_increased_expiry tests/test_web.py::TestSpotifyOAuthClient::test_get_one_retry_header tests/test_web.py::TestSpotifyOAuthClient::test_get_all tests/test_web.py::TestSpotifyOAuthClient::test_get_all_none tests/test_web.py::TestSpotifyOAuthClient::test_get_user_playlists_empty tests/test_web.py::TestSpotifyOAuthClient::test_get_user_playlists_sets_params tests/test_web.py::TestSpotifyOAuthClient::test_get_user_playlists tests/test_web.py::TestSpotifyOAuthClient::test_with_all_tracks_error tests/test_web.py::TestSpotifyOAuthClient::test_with_all_tracks tests/test_web.py::TestSpotifyOAuthClient::test_with_all_tracks_uses_cached_tracks_when_unchanged tests/test_web.py::TestSpotifyOAuthClient::test_get_playlist[spotify:user:alice:playlist:bar-True] tests/test_web.py::TestSpotifyOAuthClient::test_get_playlist[spotify:user:alice:playlist:fake-False] tests/test_web.py::TestSpotifyOAuthClient::test_get_playlist[spotify:playlist:bar-True] tests/test_web.py::TestSpotifyOAuthClient::test_get_playlist[spotify:track:foo-False] tests/test_web.py::TestSpotifyOAuthClient::test_get_playlist[https://play.spotify.com/foo-False] tests/test_web.py::TestSpotifyOAuthClient::test_get_playlist[total/junk-False] tests/test_web.py::TestSpotifyOAuthClient::test_get_playlist_sets_params_for_playlist tests/test_web.py::TestSpotifyOAuthClient::test_get_playlist_error tests/test_web.py::TestSpotifyOAuthClient::test_get_playlist_sets_params_for_tracks tests/test_web.py::TestSpotifyOAuthClient::test_get_playlist_collates_tracks tests/test_web.py::TestSpotifyOAuthClient::test_get_playlist_error_msg[spotify:artist:foo-Spotify tests/test_web.py::TestSpotifyOAuthClient::test_get_playlist_error_msg[my-bad-uri-Spotify] tests/test_web.py::TestSpotifyOAuthClient::test_clear_cache tests/test_web.py::TestSpotifyOAuthClient::test_logged_in[alice-True] tests/test_web.py::TestSpotifyOAuthClient::test_logged_in[None-False] tests/test_web.py::TestSpotifyOAuthClient::test_get_album tests/test_web.py::TestSpotifyOAuthClient::test_get_album_wrong_linktype tests/test_web.py::TestSpotifyOAuthClient::test_get_artist_albums[True] tests/test_web.py::TestSpotifyOAuthClient::test_get_artist_albums[False] tests/test_web.py::TestSpotifyOAuthClient::test_get_artist_albums_error tests/test_web.py::TestSpotifyOAuthClient::test_get_artist_albums_wrong_linktype tests/test_web.py::TestSpotifyOAuthClient::test_get_artist_albums_value_error tests/test_web.py::TestSpotifyOAuthClient::test_get_track[spotify:track:abc-True] tests/test_web.py::TestSpotifyOAuthClient::test_get_track[spotify:track:xyz-False] tests/test_web.py::TestSpotifyOAuthClient::test_get_track[spotify:user:alice:playlist:bar-False] tests/test_web.py::TestSpotifyOAuthClient::test_get_track[spotify:playlist:bar-False] tests/test_web.py::TestSpotifyOAuthClient::test_get_track[spotify:artist:baz-False] tests/test_web.py::TestSpotifyOAuthClient::test_get_track[spotify:album:foo-False] tests/test_web.py::TestSpotifyOAuthClient::test_get_artist_top_tracks tests/test_web.py::TestSpotifyOAuthClient::test_get_artist_top_tracks_invalid_uri tests/test_web.py::test_weblink_from_uri_spotify_uri[spotify:playlist:foo-LinkType.PLAYLIST-foo] tests/test_web.py::test_weblink_from_uri_spotify_uri[spotify:track:bar-LinkType.TRACK-bar] tests/test_web.py::test_weblink_from_uri_spotify_uri[spotify:artist:blah-LinkType.ARTIST-blah] tests/test_web.py::test_weblink_from_uri_spotify_uri[spotify:album:stuff-LinkType.ALBUM-stuff] tests/test_web.py::test_weblink_from_uri_spotify_uri[spotify:your:albums-LinkType.YOUR-None] tests/test_web.py::test_weblink_from_uri_playlist[spotify:user:alice:playlist:foo-foo-alice] tests/test_web.py::test_weblink_from_uri_playlist[spotify:user:alice:starred-None-alice] tests/test_web.py::test_weblink_from_uri_playlist[spotify:playlist:foo-foo-None] tests/test_web.py::test_weblink_from_uri_playlist[http://open.spotify.com/playlist/foo-foo-None] tests/test_web.py::test_weblink_from_uri_playlist[https://open.spotify.com/playlist/foo-foo-None] tests/test_web.py::test_weblink_from_uri_playlist[https://play.spotify.com/playlist/foo-foo-None] tests/test_web.py::test_weblink_from_uri_raises[spotify:user:alice:track:foo] tests/test_web.py::test_weblink_from_uri_raises[local:user:alice:playlist:foo] tests/test_web.py::test_weblink_from_uri_raises[spotify:track:foo:bar] tests/test_web.py::test_weblink_from_uri_raises[spotify:album:] tests/test_web.py::test_weblink_from_uri_raises[https://yahoo.com/playlist/foo] tests/test_web.py::test_weblink_from_uri_raises[https://play.spotify.com/foo] tests/test_web.py::test_weblink_from_uri_raises[total/junk]