2016-09-25 16 views
3

編寫腳本Spotipy從給定的專輯,我偶爾發現了錯誤返回專輯曲目:Spotipy - 列表索引超出範圍

album_id = results["albums"]["items"][0]["uri"] 
IndexError: list index out of range 

錯誤往往出現更多的當紅藝人遍歷所有的他們的專輯。我猜測結果列表已經達到了極限,或者它以某種方式失序。無論哪種方式,我不知道如何解決它,因爲我很確定我從Spotipy網站上獲得了album_id行。有任何想法嗎?

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import spotipy 

sp = spotipy.Spotify() 
sp.trace = False 


def get_artist_albums(artist): 
    results = sp.search(q = "artist:" + artist, type = "artist") 
    items = results["artists"]["items"] 
    artist = items[0] 
    # print artist 

    albums = [] 
    albumsTitles = [] 
    results = sp.artist_albums(artist["id"], album_type = "album") 
    albums.extend(results["items"]) 
    while results["next"]: 
    results = sp.next(results) 
    albums.extend(results["items"]) 
    seen = set() # to avoid dups 
    albums.sort(key = lambda album:album["name"].lower()) 

    for album in albums: 
    albumTitle = album["name"] 
    if albumTitle not in seen: 
     print((" " + albumTitle)) 
     seen.add(albumTitle) 
     albumsTitles.append(albumTitle) 

    # return albumsTitles 
    return albumsTitles 

def get_albums_tracks(album): 
    albumtracks = [] 

    results = sp.search(q = "album:" + album, type = "album") 

    # get the first album uri 
    album_id = results["albums"]["items"][0]["uri"] 

    # get album tracks 
    tracks = sp.album_tracks(album_id) 
    c = 1 
    # print album 
    for track in tracks["items"]: 
    # print "#%s %s" %(c, track["name"]) 
    albumtracks.append(track["name"]) 
    c +=1 
    return albumtracks 


# 3 album band - ok 
phosgoreAlbums = get_artist_albums("Phosgore") 
for item in phosgoreAlbums: 
    print get_albums_tracks(item) 
    print "" 

# 6 album band - ok 
# (well technically 2, but's let not get into that night now) 
joyDivisionAlbums = get_artist_albums("Joy Division") 
for item in joyDivisionAlbums: 
    print get_albums_tracks(item) 
    print "" 

# 34 albums - falls over 
cherAlbums = get_artist_albums("Cher") 
for item in cherAlbums: 
    print get_albums_tracks(item) 
    print "" 

# 38 album band - falls over 
theCureAlbums = get_artist_albums("The Cure") 
for item in theCureAlbums: 
    print get_albums_tracks(item) 
    print "" 

# 43 album band - falls over 
aliceCooperAlbums = get_artist_albums("Alice Cooper") 
for item in aliceCooperAlbums: 
    print get_albums_tracks(item) 
    print "" 
+0

您能否提供一個樣本藝術家+專輯組合?或者,它是否是非確定性的? – alecxe

+0

@alecxe我用一些統計數據更新了代碼。我似乎有點隨意 - 這並沒有多大幫助 –

+0

如果您在請求之間添加中間人爲延遲 - 它是否有助於降低失敗率? – alecxe

回答

3

results["albums"]["items"]僅僅是一個空列表,所以在指數0沒有元素。在嘗試索引它之前,您可以測試一下:

if not results["albums"]["items"]: 
    # no albums found, so no tracks either 
    return [] 

album_id = results["albums"]["items"][0]["uri"]