Spotipy - индекс списка вне допустимого диапазона

При написании сценария Spotipy для возврата дорожек альбома из данного альбома я иногда получаю сообщение об ошибке:

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

Ошибка, как правило, возникает у более популярных исполнителей, перебирающих все свои альбомы. Я предполагаю, что список результатов либо достиг своего предела, либо каким-то образом выходит из строя. В любом случае, я не уверен, как это исправить, поскольку я уверен, что получил строку Album_id с веб-сайта Spotipy. Любые идеи?

#!/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 ""

person Ghoul Fool    schedule 25.09.2016    source источник
comment
Не могли бы вы предоставить образец комбинации «исполнитель + альбом», для которой это не удается? Или это недетерминировано?   -  person alecxe    schedule 25.09.2016
comment
@alecxe Я обновил код, добавив несколько статистических данных. Я, кажется, немного на случайной стороне, что не очень помогает   -  person Ghoul Fool    schedule 26.09.2016
comment
А если добавить промежуточные искусственные задержки между запросами — поможет ли это снизить процент отказов?..   -  person alecxe    schedule 26.09.2016
comment
@alecxe замедление счета (time.sleep(1)) не повлияло   -  person Ghoul Fool    schedule 27.09.2016
comment
@Martijn Pieters♦ Отлично сработало, спасибо! У Spotify есть Alice Copper, Theatre of Death: Live At Hammersmith 2009, как без треков — кто знал? Плохой Spotify, без печенья.   -  person Ghoul Fool    schedule 27.09.2016


Ответы (1)


results["albums"]["items"] — это просто пустой список, поэтому в индексе 0 нет элементов. Вы можете проверить это, прежде чем пытаться индексировать его:

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

album_id = results["albums"]["items"][0]["uri"]
person Martijn Pieters    schedule 25.09.2016