Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add deprecation warnings and FAQ to respond to Spotify's API changes #1177

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,14 @@ Add your changes below.
- Added `personalized_playlist.py`, `track_recommendations.py`, and `audio_features_analysis.py` to `/examples`.
- Discord badge in README
- Added `SpotifyBaseException` and moved all exceptions to `exceptions.py`
- Marked the following methods as deprecated:
- artist_related_artists
- recommendations
- audio_features
- audio_analysis
- featured_playlists
- category_playlists
- Added FAQ entry for inaccessible playlists

### Fixed
- Audiobook integration tests
Expand Down
6 changes: 6 additions & 0 deletions FAQ.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,3 +74,9 @@ sp = spotipy.Spotify(
)
```
The error raised is a `spotipy.exceptions.SpotifyException`

### I get a 404 when trying to access a Spotify-owned playlist

Spotify has begun restricting access to algorithmic and Spotify-owned editorial playlists.
Only applications with an existing extended mode will still have access to these playlists.
Read more about this change here: [Introducing some changes to our Web API](https://developer.spotify.com/blog/2024-11-27-changes-to-the-web-api)
32 changes: 32 additions & 0 deletions spotipy/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -458,6 +458,11 @@ def artist_related_artists(self, artist_id):
Parameters:
- artist_id - the artist ID, URI or URL
"""
warnings.warn(
"You're using `artist_related_artists(...)`, "
"which is marked as deprecated by Spotify.",
DeprecationWarning
)
trid = self._get_id("artist", artist_id)
return self._get("artists/" + trid + "/related-artists")

Expand Down Expand Up @@ -1587,6 +1592,11 @@ def featured_playlists(
(the first object). Use with limit to get the next set of
items.
"""
warnings.warn(
"You're using `featured_playlists(...)`, "
"which is marked as deprecated by Spotify.",
DeprecationWarning,
)
return self._get(
"browse/featured-playlists",
locale=locale,
Expand Down Expand Up @@ -1671,6 +1681,11 @@ def category_playlists(
(the first object). Use with limit to get the next set of
items.
"""
warnings.warn(
"You're using `category_playlists(...)`, "
"which is marked as deprecated by Spotify.",
DeprecationWarning,
)
return self._get(
"browse/categories/" + category_id + "/playlists",
country=country,
Expand Down Expand Up @@ -1708,6 +1723,12 @@ def recommendations(
attributes listed in the documentation, these values
provide filters and targeting on results.
"""
warnings.warn(
"You're using `recommendations(...)`, "
"which is marked as deprecated by Spotify.",
DeprecationWarning,
)

params = dict(limit=limit)
if seed_artists:
params["seed_artists"] = ",".join(
Expand Down Expand Up @@ -1754,6 +1775,11 @@ def audio_analysis(self, track_id):
Parameters:
- track_id - a track URI, URL or ID
"""
warnings.warn(
"You're using `audio_analysis(...)`, "
"which is marked as deprecated by Spotify.",
DeprecationWarning,
)
trid = self._get_id("track", track_id)
return self._get("audio-analysis/" + trid)

Expand All @@ -1762,6 +1788,12 @@ def audio_features(self, tracks=[]):
Parameters:
- tracks - a list of track URIs, URLs or IDs, maximum: 100 ids
"""
warnings.warn(
"You're using `audio_features(...)`, "
"which is marked as deprecated by Spotify.",
DeprecationWarning,
)

if isinstance(tracks, str):
trackid = self._get_id("track", tracks)
results = self._get("audio-features/?ids=" + trackid)
Expand Down
39 changes: 0 additions & 39 deletions tests/integration/non_user_endpoints/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,34 +73,6 @@ def setUpClass(self):
client_credentials_manager=SpotifyClientCredentials())
self.spotify.trace = False

def test_audio_analysis(self):
result = self.spotify.audio_analysis(self.four_tracks[0])
assert ('beats' in result)

def test_audio_features(self):
results = self.spotify.audio_features(self.four_tracks)
self.assertTrue(len(results) == len(self.four_tracks))
for track in results:
assert ('speechiness' in track)

def test_audio_features_with_bad_track(self):
bad_tracks = ['spotify:track:bad']
input = self.four_tracks + bad_tracks
results = self.spotify.audio_features(input)
self.assertTrue(len(results) == len(input))
for track in results[:-1]:
if track is not None:
assert ('speechiness' in track)
self.assertTrue(results[-1] is None)

def test_recommendations(self):
results = self.spotify.recommendations(
seed_tracks=self.four_tracks,
min_danceability=0,
max_loudness=0,
target_popularity=50)
self.assertTrue(len(results['tracks']) == 20)

def test_artist_urn(self):
artist = self.spotify.artist(self.radiohead_urn)
self.assertTrue(artist['name'] == 'Radiohead')
Expand Down Expand Up @@ -179,17 +151,6 @@ def test_artist_top_tracks(self):
self.assertTrue('tracks' in results)
self.assertTrue(len(results['tracks']) == 10)

def test_artist_related_artists(self):
results = self.spotify.artist_related_artists(self.weezer_urn)
self.assertTrue('artists' in results)
self.assertTrue(len(results['artists']) == 20)

found = False
for artist in results['artists']:
if artist['name'] == 'Jimmy Eat World':
found = True
self.assertTrue(found)

def test_artist_search(self):
results = self.spotify.search(q='weezer', type='artist')
self.assertTrue('artists' in results)
Expand Down
31 changes: 0 additions & 31 deletions tests/integration/user_endpoints/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -393,33 +393,6 @@ def test_categories_limit_high(self):
response = self.spotify.categories(limit=50)
self.assertLessEqual(len(response['categories']['items']), 50)

def test_category_playlists(self):
response = self.spotify.categories()
category = 'rock'
for cat in response['categories']['items']:
cat_id = cat['id']
if cat_id == category:
response = self.spotify.category_playlists(category_id=cat_id)
self.assertGreater(len(response['playlists']["items"]), 0)

def test_category_playlists_limit_low(self):
response = self.spotify.categories()
category = 'rock'
for cat in response['categories']['items']:
cat_id = cat['id']
if cat_id == category:
response = self.spotify.category_playlists(category_id=cat_id, limit=1)
self.assertEqual(len(response['categories']['items']), 1)

def test_category_playlists_limit_high(self):
response = self.spotify.categories()
category = 'rock'
for cat in response['categories']['items']:
cat_id = cat['id']
if cat_id == category:
response = self.spotify.category_playlists(category_id=cat_id, limit=50)
self.assertLessEqual(len(response['categories']['items']), 50)

def test_new_releases(self):
response = self.spotify.new_releases()
self.assertGreater(len(response['albums']['items']), 0)
Expand All @@ -432,10 +405,6 @@ def test_new_releases_limit_high(self):
response = self.spotify.new_releases(limit=50)
self.assertLessEqual(len(response['albums']['items']), 50)

def test_featured_releases(self):
response = self.spotify.featured_playlists()
self.assertGreater(len(response['playlists']), 0)


class SpotipyFollowApiTests(unittest.TestCase):
@classmethod
Expand Down
Loading