QSpotifyPlaylistContainer *QSpotifyUser::playlistContainer() const { if (!m_playlistContainer) { sp_playlistcontainer *pc; if (QSpotifySession::instance()->user() == this) { pc = sp_session_playlistcontainer(QSpotifySession::instance()->m_sp_session); sp_playlistcontainer_add_ref(pc); } else { pc = sp_session_publishedcontainer_for_user_create(QSpotifySession::instance()->m_sp_session, m_canonicalName.toUtf8().constData()); } m_playlistContainer = new QSpotifyPlaylistContainer(pc); m_playlistContainer->init(); connect(m_playlistContainer, SIGNAL(playlistContainerDataChanged()), this, SIGNAL(playlistsChanged())); connect(m_playlistContainer, SIGNAL(playlistsNameChanged()), this, SIGNAL(playlistsNameChanged())); } return m_playlistContainer; }
void QSpotifyPlaylistContainer::updatePlaylists() { m_formattedAvailablePlaylists.clear(); m_formattedUnavailablePlaylists.clear(); m_playlistsFlat.clear(); QStack<QSpotifyPlaylist *> folders; for (int i = 0; i < m_playlists.count(); ++i) { QSpotifyPlaylist *playlist = m_playlists.at(i); if (playlist->type() == QSpotifyPlaylist::Playlist) { m_playlistsFlat.append((QObject*)playlist); if (!QSpotifySession::instance()->offlineMode() || playlist->availableOffline()) { if (folders.isEmpty()) m_formattedAvailablePlaylists.append((QObject*)(playlist)); else folders.top()->m_availablePlaylists.append((QObject*)(playlist)); } else { if (folders.isEmpty()) m_formattedUnavailablePlaylists.append((QObject*)(playlist)); else folders.top()->m_unavailablePlaylists.append((QObject*)(playlist)); } } else if (playlist->type() == QSpotifyPlaylist::Folder) { playlist->clearPlaylists(); folders.push(playlist); } else if (playlist->type() == QSpotifyPlaylist::FolderEnd) { if (folders.isEmpty()) continue; QSpotifyPlaylist *folder = folders.pop(); if (folders.isEmpty()) m_formattedAvailablePlaylists.append((QObject *)(folder)); else folders.top()->m_availablePlaylists.append(folder); emit folder->playlistsChanged(); } } emit playlistContainerDataChanged(); }