Spotipy - 如何从给定索引开始的播放列表中获取歌曲?
Spotipy - how do I get songs from a playlist starting at a given index?
我在文档中阅读了有关偏移参数的内容;但是,我不知道如何使用它。到目前为止,这是我的代码。不幸的是,只能从播放列表中检索到前 100 首歌曲。如何更改索引以便从播放列表中检索更多歌曲?
import os, re, shutil
import spotipy
import spotipy.util as util
import time
# Parameters
username = 'REDACTED'
client_id = 'REDACTED'
client_secret = 'REDACTED'
redirect_uri = 'http://localhost/'
scope = 'user-library-read'
playlist = '17gneMykp6L6O5R70wm0gE'
def show_tracks(tracks):
for i, item in enumerate(tracks['items']):
track = item['track']
myName = re.sub('[^A-Za-z0-9\ ]+', '', track['name'])
dirName = "/Users/pschorn/Songs/" + myName + ".app"
if os.path.exists(dirName):
continue
#shutil.rmtree(dirName)
os.mkdir(dirName)
os.mkdir(dirName + "/Contents")
with open(dirName + "/Contents/PkgInfo", "w+") as f:
f.write("APPL????")
os.mkdir(dirName + "/Contents/MacOS")
with open(dirName + "/Contents/MacOS/" + myName, "w+") as f:
f.write("#!/bin/bash\n")
f.write("osascript -e \'tell application \"Spotify\" to play track \"{}\"\'".format(track['uri']))
os.lchmod(dirName + "/Contents/MacOS/" + myName, 0o777)
myName = re.sub('\ ', '\ ', myName)
# I've installed a third-party command-line utility that
# allows me to set the icon for applications.
# If there's a way to do this from python, let me know.
os.system(
'/usr/local/bin/fileicon set /Users/pschorn/Songs/' + myName + '.app /Users/pschorn/Code/PyCharmSupport/Icon.icns')
token = util.prompt_for_user_token(username, scope, client_id, client_secret, redirect_uri)
if token:
sp = spotipy.Spotify(auth=token)
results = sp.user_playlist(username, playlist, fields="tracks,next")
tracks = results['tracks', offset=100]
show_tracks(tracks)
else:
print("Can't get token for", username)
编辑:从那以后,我想出了如何 return 歌曲从给定索引开始的方法,而且远不止于此。你可以查看我的代码here!它检索所有用户播放列表中的所有歌曲,并为每一首可以打开播放歌曲的应用程序。这样做的目的是让您可以直接从 Spotlight 搜索中播放您的 Spotify 歌曲!
我写的这个自定义 class 扩展了 Spotipy 库提供的功能,它有一个处理偏移量的包装函数。
def user_playlist_tracks_full(spotify, user, playlist_id=None, fields=None, market=None):
""" Get full details of the tracks of a playlist owned by a user.
Parameters:
- spotify - spotipy instance
- user - the id of the user
- playlist_id - the id of the playlist
- fields - which fields to return
- market - an ISO 3166-1 alpha-2 country code.
"""
# first run through also retrieves total no of songs in library
response = spotify.user_playlist_tracks(user, playlist_id, fields=fields, limit=100, market=market)
results = response["items"]
# subsequently runs until it hits the user-defined limit or has read all songs in the library
while len(results) < response["total"]:
response = spotify.user_playlist_tracks(
user, playlist_id, fields=fields, limit=100, offset=len(results), market=market
)
results.extend(response["items"])
return results
此代码可能足以说明您必须执行的操作,每次循环并更改偏移量。
完整的 class 是 in a standalone gist that should work,在这个例子中,我只是将 self
替换为 spotify
。
我在文档中阅读了有关偏移参数的内容;但是,我不知道如何使用它。到目前为止,这是我的代码。不幸的是,只能从播放列表中检索到前 100 首歌曲。如何更改索引以便从播放列表中检索更多歌曲?
import os, re, shutil
import spotipy
import spotipy.util as util
import time
# Parameters
username = 'REDACTED'
client_id = 'REDACTED'
client_secret = 'REDACTED'
redirect_uri = 'http://localhost/'
scope = 'user-library-read'
playlist = '17gneMykp6L6O5R70wm0gE'
def show_tracks(tracks):
for i, item in enumerate(tracks['items']):
track = item['track']
myName = re.sub('[^A-Za-z0-9\ ]+', '', track['name'])
dirName = "/Users/pschorn/Songs/" + myName + ".app"
if os.path.exists(dirName):
continue
#shutil.rmtree(dirName)
os.mkdir(dirName)
os.mkdir(dirName + "/Contents")
with open(dirName + "/Contents/PkgInfo", "w+") as f:
f.write("APPL????")
os.mkdir(dirName + "/Contents/MacOS")
with open(dirName + "/Contents/MacOS/" + myName, "w+") as f:
f.write("#!/bin/bash\n")
f.write("osascript -e \'tell application \"Spotify\" to play track \"{}\"\'".format(track['uri']))
os.lchmod(dirName + "/Contents/MacOS/" + myName, 0o777)
myName = re.sub('\ ', '\ ', myName)
# I've installed a third-party command-line utility that
# allows me to set the icon for applications.
# If there's a way to do this from python, let me know.
os.system(
'/usr/local/bin/fileicon set /Users/pschorn/Songs/' + myName + '.app /Users/pschorn/Code/PyCharmSupport/Icon.icns')
token = util.prompt_for_user_token(username, scope, client_id, client_secret, redirect_uri)
if token:
sp = spotipy.Spotify(auth=token)
results = sp.user_playlist(username, playlist, fields="tracks,next")
tracks = results['tracks', offset=100]
show_tracks(tracks)
else:
print("Can't get token for", username)
编辑:从那以后,我想出了如何 return 歌曲从给定索引开始的方法,而且远不止于此。你可以查看我的代码here!它检索所有用户播放列表中的所有歌曲,并为每一首可以打开播放歌曲的应用程序。这样做的目的是让您可以直接从 Spotlight 搜索中播放您的 Spotify 歌曲!
我写的这个自定义 class 扩展了 Spotipy 库提供的功能,它有一个处理偏移量的包装函数。
def user_playlist_tracks_full(spotify, user, playlist_id=None, fields=None, market=None):
""" Get full details of the tracks of a playlist owned by a user.
Parameters:
- spotify - spotipy instance
- user - the id of the user
- playlist_id - the id of the playlist
- fields - which fields to return
- market - an ISO 3166-1 alpha-2 country code.
"""
# first run through also retrieves total no of songs in library
response = spotify.user_playlist_tracks(user, playlist_id, fields=fields, limit=100, market=market)
results = response["items"]
# subsequently runs until it hits the user-defined limit or has read all songs in the library
while len(results) < response["total"]:
response = spotify.user_playlist_tracks(
user, playlist_id, fields=fields, limit=100, offset=len(results), market=market
)
results.extend(response["items"])
return results
此代码可能足以说明您必须执行的操作,每次循环并更改偏移量。
完整的 class 是 in a standalone gist that should work,在这个例子中,我只是将 self
替换为 spotify
。