Skip to content

Commit 1741ac4

Browse files
committed
Fix floats in API response (Fixes mopidy#375)
1 parent 5c49369 commit 1741ac4

File tree

2 files changed

+80
-4
lines changed

2 files changed

+80
-4
lines changed

mopidy_spotify/translator.py

+15-4
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,16 @@ def web_to_album(web_album):
248248
artists=artists)
249249

250250

251-
def web_to_track(web_track):
251+
def int_or_none(inp):
252+
if inp is not None:
253+
return int(float(inp))
254+
255+
256+
def web_to_track(web_track, bitrate=None, album=None):
257+
ref = web_to_track_ref(web_track)
258+
if ref is None:
259+
return
260+
252261
artists = [
253262
web_to_artist(web_artist) for web_artist in web_track['artists']]
254263
album = web_to_album(web_track['album'])
@@ -258,6 +267,8 @@ def web_to_track(web_track):
258267
name=web_track['name'],
259268
artists=artists,
260269
album=album,
261-
length=web_track['duration_ms'],
262-
disc_no=web_track['disc_number'],
263-
track_no=web_track['track_number'])
270+
length=int_or_none(web_track.get("duration_ms")),
271+
disc_no=int_or_none(web_track.get("disc_number")),
272+
track_no=int_or_none(web_track.get("track_number")),
273+
bitrate=bitrate,
274+
)

tests/test_translator.py

+65
Original file line numberDiff line numberDiff line change
@@ -468,3 +468,68 @@ def test_successful_translation(self, web_track_mock):
468468
assert track.track_no == 7
469469
assert track.disc_no == 1
470470
assert track.length == 174300
471+
472+
def test_sets_bitrate(self, web_track_mock):
473+
track = translator.web_to_track(web_track_mock, bitrate=100)
474+
475+
assert track.bitrate == 100
476+
477+
def test_sets_specified_album(self, web_track_mock):
478+
alt_album = models.Album(uri="spotify:album:xyz", name="XYZ 789")
479+
480+
track = translator.web_to_track(web_track_mock, album=alt_album)
481+
482+
assert track.album.uri == "spotify:album:xyz"
483+
assert track.album.name == "XYZ 789"
484+
485+
def test_filters_out_none_artists(self, web_track_mock):
486+
web_track_mock["artists"].insert(0, {})
487+
web_track_mock["artists"].insert(0, {"foo": "bar"})
488+
489+
track = translator.web_to_track(web_track_mock)
490+
artists = [models.Artist(uri="spotify:artist:abba", name="ABBA")]
491+
492+
assert list(track.artists) == artists
493+
494+
def test_ignores_missing_album(self, web_track_mock):
495+
del web_track_mock["album"]
496+
497+
track = translator.web_to_track(web_track_mock)
498+
499+
assert track.name == "ABC 123"
500+
assert track.length == 174300
501+
assert track.album is None
502+
503+
def test_ignores_invalid_album(self, web_track_mock):
504+
web_track_mock["album"]["uri"] = None
505+
506+
track = translator.web_to_track(web_track_mock)
507+
508+
assert track.name == "ABC 123"
509+
assert track.album is None
510+
511+
@pytest.mark.parametrize(
512+
"data",
513+
[
514+
(123),
515+
(123.0),
516+
("123"),
517+
("123.0"),
518+
],
519+
)
520+
def test_int_or_none_number(self, data):
521+
assert translator.int_or_none(data) == 123
522+
523+
def test_int_or_none_none(self):
524+
assert translator.int_or_none(None) is None
525+
526+
def test_ints_might_be_floats(self, web_track_mock):
527+
web_track_mock["duration_ms"] = 123.0
528+
web_track_mock["disc_number"] = "456.0"
529+
web_track_mock["track_number"] = 99.9
530+
531+
track = translator.web_to_track(web_track_mock)
532+
533+
assert track.length == 123
534+
assert track.disc_no == 456
535+
assert track.track_no == 99

0 commit comments

Comments
 (0)