mirror of
https://github.com/spotipy-dev/spotipy.git
synced 2026-06-19 01:03:53 +00:00
Added endpoints for shows/podcasts and episodes, closes #450
https://developer.spotify.com/documentation/web-api/reference-beta/#category-shows https://developer.spotify.com/documentation/web-api/reference-beta/#category-episodes
This commit is contained in:
parent
4b8350b8bc
commit
8b84300597
@ -368,6 +368,85 @@ class Spotify(object):
|
|||||||
tlist = [self._get_id("album", a) for a in albums]
|
tlist = [self._get_id("album", a) for a in albums]
|
||||||
return self._get("albums/?ids=" + ",".join(tlist))
|
return self._get("albums/?ids=" + ",".join(tlist))
|
||||||
|
|
||||||
|
def show(self, show_id, market=None):
|
||||||
|
""" returns a single show given the show's ID, URIs or URL
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
- show_id - the show ID, URI or URL
|
||||||
|
- market - an ISO 3166-1 alpha-2 country code.
|
||||||
|
The show must be available in the given market.
|
||||||
|
If user-based authorization is in use, the user's country
|
||||||
|
takes precedence. If neither market nor user country are
|
||||||
|
provided, the content is considered unavailable for the client.
|
||||||
|
"""
|
||||||
|
|
||||||
|
trid = self._get_id("show", show_id)
|
||||||
|
return self._get("shows/" + trid, market=market)
|
||||||
|
|
||||||
|
def shows(self, shows, market=None):
|
||||||
|
""" returns a list of shows given the show IDs, URIs, or URLs
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
- shows - a list of show IDs, URIs or URLs
|
||||||
|
- market - an ISO 3166-1 alpha-2 country code.
|
||||||
|
Only shows available in the given market will be returned.
|
||||||
|
If user-based authorization is in use, the user's country
|
||||||
|
takes precedence. If neither market nor user country are
|
||||||
|
provided, the content is considered unavailable for the client.
|
||||||
|
"""
|
||||||
|
|
||||||
|
tlist = [self._get_id("show", s) for s in shows]
|
||||||
|
return self._get("shows/?ids=" + ",".join(tlist), market=market)
|
||||||
|
|
||||||
|
def show_episodes(self, show_id, limit=50, offset=0, market=None):
|
||||||
|
""" Get Spotify catalog information about a show's episodes
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
- show_id - the show ID, URI or URL
|
||||||
|
- limit - the number of items to return
|
||||||
|
- offset - the index of the first item to return
|
||||||
|
- market - an ISO 3166-1 alpha-2 country code.
|
||||||
|
Only episodes available in the given market will be returned.
|
||||||
|
If user-based authorization is in use, the user's country
|
||||||
|
takes precedence. If neither market nor user country are
|
||||||
|
provided, the content is considered unavailable for the client.
|
||||||
|
"""
|
||||||
|
|
||||||
|
trid = self._get_id("show", show_id)
|
||||||
|
return self._get(
|
||||||
|
"shows/" + trid + "/episodes/", limit=limit, offset=offset, market=market
|
||||||
|
)
|
||||||
|
|
||||||
|
def episode(self, episode_id, market=None):
|
||||||
|
""" returns a single episode given the episode's ID, URIs or URL
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
- episode_id - the episode ID, URI or URL
|
||||||
|
- market - an ISO 3166-1 alpha-2 country code.
|
||||||
|
The episode must be available in the given market.
|
||||||
|
If user-based authorization is in use, the user's country
|
||||||
|
takes precedence. If neither market nor user country are
|
||||||
|
provided, the content is considered unavailable for the client.
|
||||||
|
"""
|
||||||
|
|
||||||
|
trid = self._get_id("episode", episode_id)
|
||||||
|
return self._get("episodes/" + trid, market=market)
|
||||||
|
|
||||||
|
def episodes(self, episodes, market=None):
|
||||||
|
""" returns a list of episodes given the episode IDs, URIs, or URLs
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
- episodes - a list of episode IDs, URIs or URLs
|
||||||
|
- market - an ISO 3166-1 alpha-2 country code.
|
||||||
|
Only episodes available in the given market will be returned.
|
||||||
|
If user-based authorization is in use, the user's country
|
||||||
|
takes precedence. If neither market nor user country are
|
||||||
|
provided, the content is considered unavailable for the client.
|
||||||
|
"""
|
||||||
|
|
||||||
|
tlist = [self._get_id("episode", e) for e in episodes]
|
||||||
|
return self._get("episodes/?ids=" + ",".join(tlist), market=market)
|
||||||
|
|
||||||
def search(self, q, limit=10, offset=0, type="track", market=None):
|
def search(self, q, limit=10, offset=0, type="track", market=None):
|
||||||
""" searches for an item
|
""" searches for an item
|
||||||
|
|
||||||
@ -377,7 +456,7 @@ class Spotify(object):
|
|||||||
- limit - the number of items to return (min = 1, default = 10, max = 50)
|
- limit - the number of items to return (min = 1, default = 10, max = 50)
|
||||||
- offset - the index of the first item to return
|
- offset - the index of the first item to return
|
||||||
- type - the type of item to return. One of 'artist', 'album',
|
- type - the type of item to return. One of 'artist', 'album',
|
||||||
'track' or 'playlist'
|
'track', 'playlist', 'show', or 'episode'
|
||||||
- market - An ISO 3166-1 alpha-2 country code or the string
|
- market - An ISO 3166-1 alpha-2 country code or the string
|
||||||
from_token.
|
from_token.
|
||||||
"""
|
"""
|
||||||
@ -401,7 +480,7 @@ class Spotify(object):
|
|||||||
"""
|
"""
|
||||||
return self._get("me/playlists", limit=limit, offset=offset)
|
return self._get("me/playlists", limit=limit, offset=offset)
|
||||||
|
|
||||||
def playlist(self, playlist_id, fields=None, market=None):
|
def playlist(self, playlist_id, fields=None, market=None, additional_types=("track",)):
|
||||||
""" Gets playlist by id.
|
""" Gets playlist by id.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
@ -409,12 +488,25 @@ class Spotify(object):
|
|||||||
- fields - which fields to return
|
- fields - which fields to return
|
||||||
- market - An ISO 3166-1 alpha-2 country code or the
|
- market - An ISO 3166-1 alpha-2 country code or the
|
||||||
string from_token.
|
string from_token.
|
||||||
|
- additional_types - list of item types to return.
|
||||||
|
valid types are: track and episode
|
||||||
"""
|
"""
|
||||||
plid = self._get_id("playlist", playlist_id)
|
plid = self._get_id("playlist", playlist_id)
|
||||||
return self._get("playlists/%s" % (plid), fields=fields, market=market)
|
return self._get(
|
||||||
|
"playlists/%s" % (plid),
|
||||||
|
fields=fields,
|
||||||
|
market=market,
|
||||||
|
additional_types=",".join(additional_types),
|
||||||
|
)
|
||||||
|
|
||||||
def playlist_tracks(
|
def playlist_tracks(
|
||||||
self, playlist_id, fields=None, limit=100, offset=0, market=None
|
self,
|
||||||
|
playlist_id,
|
||||||
|
fields=None,
|
||||||
|
limit=100,
|
||||||
|
offset=0,
|
||||||
|
market=None,
|
||||||
|
additional_types=("track",)
|
||||||
):
|
):
|
||||||
""" Get full details of the tracks of a playlist.
|
""" Get full details of the tracks of a playlist.
|
||||||
|
|
||||||
@ -424,6 +516,8 @@ class Spotify(object):
|
|||||||
- limit - the maximum number of tracks to return
|
- limit - the maximum number of tracks to return
|
||||||
- offset - the index of the first track to return
|
- offset - the index of the first track to return
|
||||||
- market - an ISO 3166-1 alpha-2 country code.
|
- market - an ISO 3166-1 alpha-2 country code.
|
||||||
|
- additional_types - list of item types to return.
|
||||||
|
valid types are: track and episode
|
||||||
"""
|
"""
|
||||||
plid = self._get_id("playlist", playlist_id)
|
plid = self._get_id("playlist", playlist_id)
|
||||||
return self._get(
|
return self._get(
|
||||||
@ -432,6 +526,7 @@ class Spotify(object):
|
|||||||
offset=offset,
|
offset=offset,
|
||||||
fields=fields,
|
fields=fields,
|
||||||
market=market,
|
market=market,
|
||||||
|
additional_types=",".join(additional_types)
|
||||||
)
|
)
|
||||||
|
|
||||||
def playlist_cover_image(self, playlist_id):
|
def playlist_cover_image(self, playlist_id):
|
||||||
@ -896,6 +991,46 @@ class Spotify(object):
|
|||||||
alist = [self._get_id("album", a) for a in albums]
|
alist = [self._get_id("album", a) for a in albums]
|
||||||
return self._delete("me/albums/?ids=" + ",".join(alist))
|
return self._delete("me/albums/?ids=" + ",".join(alist))
|
||||||
|
|
||||||
|
def current_user_saved_shows(self, limit=50, offset=0):
|
||||||
|
""" Gets a list of the shows saved in the current authorized user's
|
||||||
|
"Your Music" library
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
- limit - the number of shows to return
|
||||||
|
- offset - the index of the first show to return
|
||||||
|
|
||||||
|
"""
|
||||||
|
return self._get("me/shows", limit=limit, offset=offset)
|
||||||
|
|
||||||
|
def current_user_saved_shows_contains(self, shows=[]):
|
||||||
|
""" Check if one or more shows is already saved in
|
||||||
|
the current Spotify user’s “Your Music” library.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
- shows - a list of show URIs, URLs or IDs
|
||||||
|
"""
|
||||||
|
slist = [self._get_id("show", s) for s in shows]
|
||||||
|
return self._get("me/shows/contains?ids=" + ",".join(slist))
|
||||||
|
|
||||||
|
def current_user_saved_shows_add(self, shows=[]):
|
||||||
|
""" Add one or more albums to the current user's
|
||||||
|
"Your Music" library.
|
||||||
|
Parameters:
|
||||||
|
- shows - a list of show URIs, URLs or IDs
|
||||||
|
"""
|
||||||
|
slist = [self._get_id("show", s) for s in shows]
|
||||||
|
return self._put("me/shows?ids=" + ",".join(slist))
|
||||||
|
|
||||||
|
def current_user_saved_shows_delete(self, shows=[]):
|
||||||
|
""" Remove one or more shows from the current user's
|
||||||
|
"Your Music" library.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
- shows - a list of show URIs, URLs or IDs
|
||||||
|
"""
|
||||||
|
slist = [self._get_id("show", s) for s in shows]
|
||||||
|
return self._delete("me/shows/?ids=" + ",".join(slist))
|
||||||
|
|
||||||
def user_follow_artists(self, ids=[]):
|
def user_follow_artists(self, ids=[]):
|
||||||
""" Follow one or more artists
|
""" Follow one or more artists
|
||||||
Parameters:
|
Parameters:
|
||||||
|
|||||||
@ -46,6 +46,14 @@ class AuthTestSpotipy(unittest.TestCase):
|
|||||||
pablo_honey_urn = 'spotify:album:6AZv3m27uyRxi8KyJSfUxL'
|
pablo_honey_urn = 'spotify:album:6AZv3m27uyRxi8KyJSfUxL'
|
||||||
radiohead_urn = 'spotify:artist:4Z8W4fKeB5YxbusRsdQVPb'
|
radiohead_urn = 'spotify:artist:4Z8W4fKeB5YxbusRsdQVPb'
|
||||||
angeles_haydn_urn = 'spotify:album:1vAbqAeuJVWNAe7UR00bdM'
|
angeles_haydn_urn = 'spotify:album:1vAbqAeuJVWNAe7UR00bdM'
|
||||||
|
heavyweight_urn = 'spotify:show:5c26B28vZMN8PG0Nppmn5G'
|
||||||
|
heavyweight_id = '5c26B28vZMN8PG0Nppmn5G'
|
||||||
|
heavyweight_url = 'https://open.spotify.com/show/5c26B28vZMN8PG0Nppmn5G'
|
||||||
|
reply_all_urn = 'spotify:show:7gozmLqbcbr6PScMjc0Zl4'
|
||||||
|
heavyweight_ep1_urn = 'spotify:episode:68kq3bNz6hEuq8NtdfwERG'
|
||||||
|
heavyweight_ep1_id = '68kq3bNz6hEuq8NtdfwERG'
|
||||||
|
heavyweight_ep1_url = 'https://open.spotify.com/episode/68kq3bNz6hEuq8NtdfwERG'
|
||||||
|
reply_all_ep1_urn = 'spotify:episode:1KHjbpnmNpFmNTczQmTZlR'
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpClass(self):
|
def setUpClass(self):
|
||||||
@ -215,6 +223,67 @@ class AuthTestSpotipy(unittest.TestCase):
|
|||||||
except SpotifyException:
|
except SpotifyException:
|
||||||
self.assertTrue(True)
|
self.assertTrue(True)
|
||||||
|
|
||||||
|
def test_show_urn(self):
|
||||||
|
show = self.spotify.show(self.heavyweight_urn, market="US")
|
||||||
|
self.assertTrue(show['name'] == 'Heavyweight')
|
||||||
|
|
||||||
|
def test_show_id(self):
|
||||||
|
show = self.spotify.show(self.heavyweight_id, market="US")
|
||||||
|
self.assertTrue(show['name'] == 'Heavyweight')
|
||||||
|
|
||||||
|
def test_show_url(self):
|
||||||
|
show = self.spotify.show(self.heavyweight_url, market="US")
|
||||||
|
self.assertTrue(show['name'] == 'Heavyweight')
|
||||||
|
|
||||||
|
def test_show_bad_urn(self):
|
||||||
|
with self.assertRaises(SpotifyException):
|
||||||
|
self.spotify.show("bogus_urn", market="US")
|
||||||
|
|
||||||
|
def test_shows(self):
|
||||||
|
results = self.spotify.shows([self.heavyweight_urn, self.reply_all_urn], market="US")
|
||||||
|
self.assertTrue('shows' in results)
|
||||||
|
self.assertTrue(len(results['shows']) == 2)
|
||||||
|
|
||||||
|
def test_show_episodes(self):
|
||||||
|
results = self.spotify.show_episodes(self.heavyweight_urn, market="US")
|
||||||
|
self.assertTrue(len(results['items']) > 1)
|
||||||
|
|
||||||
|
def test_show_episodes_many(self):
|
||||||
|
results = self.spotify.show_episodes(self.reply_all_urn, market="US")
|
||||||
|
episodes = results['items']
|
||||||
|
total, received = results['total'], len(episodes)
|
||||||
|
while received < total:
|
||||||
|
results = self.spotify.show_episodes(
|
||||||
|
self.reply_all_urn, offset=received, market="US")
|
||||||
|
episodes.extend(results['items'])
|
||||||
|
received = len(episodes)
|
||||||
|
|
||||||
|
self.assertEqual(received, total)
|
||||||
|
|
||||||
|
def test_episode_urn(self):
|
||||||
|
episode = self.spotify.episode(self.heavyweight_ep1_urn, market="US")
|
||||||
|
self.assertTrue(episode['name'] == '#1 Buzz')
|
||||||
|
|
||||||
|
def test_episode_id(self):
|
||||||
|
episode = self.spotify.episode(self.heavyweight_ep1_id, market="US")
|
||||||
|
self.assertTrue(episode['name'] == '#1 Buzz')
|
||||||
|
|
||||||
|
def test_episode_url(self):
|
||||||
|
episode = self.spotify.episode(self.heavyweight_ep1_url, market="US")
|
||||||
|
self.assertTrue(episode['name'] == '#1 Buzz')
|
||||||
|
|
||||||
|
def test_episode_bad_urn(self):
|
||||||
|
with self.assertRaises(SpotifyException):
|
||||||
|
self.spotify.episode("bogus_urn", market="US")
|
||||||
|
|
||||||
|
def test_episodes(self):
|
||||||
|
results = self.spotify.episodes(
|
||||||
|
[self.heavyweight_ep1_urn, self.reply_all_ep1_urn],
|
||||||
|
market="US"
|
||||||
|
)
|
||||||
|
self.assertTrue('episodes' in results)
|
||||||
|
self.assertTrue(len(results['episodes']) == 2)
|
||||||
|
|
||||||
def test_unauthenticated_post_fails(self):
|
def test_unauthenticated_post_fails(self):
|
||||||
with self.assertRaises(SpotifyException) as cm:
|
with self.assertRaises(SpotifyException) as cm:
|
||||||
self.spotify.user_playlist_create(
|
self.spotify.user_playlist_create(
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user