如何防止spotify在播放列表中添加不正确的歌曲?



通过Angela Yu的100天代码和我在一个项目中,用户输入YYYY-MM-DD来搜索公告牌前100名当天的100首歌曲列表。这些歌曲是通过网络抓取的,通过spotify添加到播放列表中。然而,我注意到,从多余的年份歌曲被添加。例如,如果我输入1996-11-15,一首布鲁诺·马尔斯的歌就会出现在我的播放列表中,而这首歌不是1996年的。

为了防止这种情况,我在for循环中添加了更多的条件来搜索确切的歌曲名和艺人名,然后我添加了一个名为"duplicate_check"我会为已经添加到播放列表中的歌曲添加歌曲名。问题是我现在得到的歌曲不到100首。

我如何得到100首歌曲恰好来自广告牌前100名的请求日期?

# Asks user to input YYYY-MM-DD.
time_period = input("What year would you like to travel to in YYYY-MM-DD format? ")
year = time_period.split("-")[0]
url = f"https://www.billboard.com/charts/hot-100/{time_period}/"

# Initialize BS to parse url above.
response = requests.get(url)
webpage = response.text
soup = BeautifulSoup(webpage, "html.parser")

# Scrapes Billboard page to find song titles
song_titles = soup.select(selector="ul li h3")
song_artists = soup.select(selector="li ul li span")
artist_list = [artist.getText().strip() for artist in song_artists[0:700:7]]
song_list = [title.getText().strip() for title in song_titles[0:100:1]]
song_uri_list = []
# The purpose of this list is to prevent duplication by adding the song name to this list, once the uri is added.
duplicate_check = []
# Using params and header, creates a POST request to create new playlist on my account.
params = {
"name": f"{time_period} Billboard 100",
"public": False,
"collaborative": False,
}
# Gets Access Token from .cache file generated after initializing spotipy API.
with open(".cache", "r") as file:
data = file.read().split()
token = data[1].strip(',"')
header = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
}
# Initializes Spotipy API.
sp = spotipy.Spotify(auth_manager=SpotifyOAuth(scope="playlist-modify-private",
client_id=SPOTIFY_CLIENT_ID,
client_secret=SPOTIFY_CLIENT_SECRET,
redirect_uri=SPOTIPY_REDIRECT_URI,
cache_path=".cache"
))
# Creates a playlist on my account.
response = requests.post(url=f"{SPOTIFY_ENDPOINT}/users/{SPOTIFY_USER_ID}/playlists", json=params, headers=header)
playlist_uri = json.loads(response.text)["uri"]

# Searches Spotify for each song scraped from url via a unique URI and adds it to a list.
for song, artist in zip(song_list, artist_list):
results = sp.search(q=f"track: {song} artist: {artist} year: {year}", type="track")
for dict in results["tracks"]["items"]:
if dict["name"] == song and dict["artists"][0]["name"] == artist and song not in duplicate_check:
try:
song_uri_list.append(dict["uri"])
duplicate_check.append(song)
except IndexError:
print("no song found")
pass

# Adds list of songs to playlist.
sp.playlist_add_items(
playlist_id=playlist_uri,
items=song_uri_list,
position=None
)

最初获取更多,120应该足够了,

artist_list = [artist.getText().strip() for artist in song_artists[0:840:7]]
song_list = [title.getText().strip() for title in song_titles[0:120:1]]

,然后只拍100首独特的歌曲:

# Searches Spotify for each song scraped from url via a unique URI and adds it to a list.
for song, artist in zip(song_list, artist_list):
# take only 100 songs
if len(duplicate_check >= 100): 
break
results = sp.search(q=f"track: {song} artist: {artist} year: {year}", type="track")
...

最新更新