Skip to content

Commit

Permalink
New playlist loading
Browse files Browse the repository at this point in the history
  • Loading branch information
kraxarn committed Apr 6, 2024
1 parent 0d4c1de commit 6691a06
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 37 deletions.
2 changes: 1 addition & 1 deletion lib/include/lib/spotify/api.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ namespace lib
const lib::optional<bool> &is_collaborative,
lib::callback<lib::spt::playlist> &callback);

void playlists(lib::callback<std::vector<lib::spt::playlist>> &callback);
void playlists(const paged_callback<playlist> &callback) const;

void playlist(const std::string &playlist_id,
callback<result<playlist>> &callback) const;
Expand Down
4 changes: 2 additions & 2 deletions lib/src/spotifyapi/playlists.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ void lib::spt::api::create_playlist(const std::string &name,
post("me/playlists", json, callback);
}

void lib::spt::api::playlists(lib::callback<std::vector<lib::spt::playlist>> &callback)
void lib::spt::api::playlists(const paged_callback<spt::playlist> &callback) const
{
get_items("me/playlists?limit=50", callback);
request.get_page<spt::playlist>("me/playlists?limit=50", {}, callback);
}

void lib::spt::api::playlist(const std::string &playlist_id, callback<result<spt::playlist>> &callback) const
Expand Down
103 changes: 71 additions & 32 deletions src/list/playlist.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ void List::Playlist::showEvent(QShowEvent */*event*/)
const auto &cached = cache.get_playlists();
if (!cached.empty())
{
load(cached);
load(cached, 0);
selectActive();
}

refresh();
Expand All @@ -51,6 +52,19 @@ auto List::Playlist::getItemIndex(QListWidgetItem *item) -> int
: item->data(static_cast<int>(DataRole::Index)).toInt();
}

auto List::Playlist::getPlaylists() const -> std::vector<lib::spt::playlist>
{
std::vector<lib::spt::playlist> result;
result.reserve(static_cast<size_t>(count()));

for (auto i = 0; i < count(); i++)
{
result.push_back(at(i));
}

return result;
}

void List::Playlist::onItemClicked(QListWidgetItem *item)
{
auto *mainWindow = MainWindow::find(parentWidget());
Expand Down Expand Up @@ -102,10 +116,29 @@ void List::Playlist::onItemEntered(QListWidgetItem *item)
tooltip.set(item, playlist);
}

void List::Playlist::load(const std::vector<lib::spt::playlist> &playlists)
void List::Playlist::load(const std::vector<lib::spt::playlist> &playlists, const int offset)
{
auto index = offset;

for (const auto &playlist: playlists)
{
auto *item = new QListWidgetItem(QString::fromStdString(playlist.name), this);
item->setData(static_cast<int>(DataRole::Playlist), QVariant::fromValue(playlist));
item->setData(static_cast<int>(DataRole::DefaultIndex), index);
item->setData(static_cast<int>(DataRole::Index), index++);
}

// Sort
if (settings.general.playlist_order != lib::playlist_order::none)
{
order(settings.general.playlist_order);
}
}

void List::Playlist::selectActive()
{
QListWidgetItem *activeItem = nullptr;
const lib::spt::playlist *activePlaylist = nullptr;
lib::spt::playlist activePlaylist;

std::string currentPlaylistId;
if (currentItem() != nullptr)
Expand All @@ -119,45 +152,32 @@ void List::Playlist::load(const std::vector<lib::spt::playlist> &playlists)
currentPlaylistId = lib::spt::uri_to_id(settings.general.last_playlist);
}

// Add all playlists
clear();
auto index = 0;
for (const auto &playlist: playlists)
for (auto i = 0; i < count(); i++)
{
auto *item = new QListWidgetItem(QString::fromStdString(playlist.name), this);
item->setData(static_cast<int>(DataRole::Playlist), QVariant::fromValue(playlist));
item->setData(static_cast<int>(DataRole::DefaultIndex), index);
item->setData(static_cast<int>(DataRole::Index), index++);
auto *listItem = item(i);
const auto &playlist = at(i);

if (playlist.id == currentPlaylistId)
{
activeItem = item;
activePlaylist = &playlist;
activeItem = listItem;
activePlaylist = playlist;
}
}

// Sort
if (settings.general.playlist_order != lib::playlist_order::none)
if (activeItem == nullptr)
{
order(settings.general.playlist_order);
activeItem = item(0);
}

if (activeItem == nullptr || activePlaylist == nullptr)
if (!activePlaylist.is_valid())
{
if (count() > 0)
{
activeItem = item(0);
}
if (!playlists.empty())
{
activePlaylist = playlists.data();
}
activePlaylist = at(0);
}

if (currentItem() == nullptr && activePlaylist != nullptr)
if (currentItem() == nullptr && activePlaylist.is_valid())
{
auto *mainWindow = MainWindow::find(parentWidget());
mainWindow->getSongsTree()->load(*activePlaylist);
mainWindow->getSongsTree()->load(activePlaylist);
}

if (activeItem != nullptr)
Expand All @@ -168,10 +188,29 @@ void List::Playlist::load(const std::vector<lib::spt::playlist> &playlists)

void List::Playlist::refresh()
{
spotify.playlists([this](const std::vector<lib::spt::playlist> &items)
spotify.playlists([this](const lib::result<lib::spt::page<lib::spt::playlist>> &result)
{
load(items);
cache.set_playlists(items);
if (!result.success())
{
lib::log::error("Failed to get playlists: {}", result.message());
return false;
}

const auto &page = result.value();
if (page.offset == 0)
{
clear();
}

load(page.items, page.offset);
if (page.has_next())
{
return true;
}

selectActive();
cache.set_playlists(getPlaylists());
return false;
});
}

Expand Down Expand Up @@ -331,9 +370,9 @@ auto List::Playlist::allArtists() -> std::unordered_set<std::string>
return artists;
}

auto List::Playlist::at(int index) -> lib::spt::playlist
auto List::Playlist::at(const int index) const -> lib::spt::playlist
{
auto *listItem = item(index);
const auto *listItem = item(index);
if (listItem == nullptr)
{
return {};
Expand Down
7 changes: 5 additions & 2 deletions src/list/playlist.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,12 @@ namespace List
Playlist(lib::spt::api &spotify, lib::settings &settings,
lib::cache &cache, const lib::http_client &httpClient, QWidget *parent);

void load(const std::vector<lib::spt::playlist> &items);
void refresh();
void order(lib::playlist_order item1);

auto allArtists() -> std::unordered_set<std::string>;

auto at(int index) -> lib::spt::playlist;
auto at(int index) const -> lib::spt::playlist;

protected:
void showEvent(QShowEvent *event) override;
Expand All @@ -35,7 +34,11 @@ namespace List
lib::settings &settings;
Tooltip tooltip;

void load(const std::vector<lib::spt::playlist> &playlists, int offset);
void selectActive();

auto getItemIndex(QListWidgetItem *item) -> int;
auto getPlaylists() const -> std::vector<lib::spt::playlist>;

void onItemClicked(QListWidgetItem *item);
void onItemDoubleClicked(QListWidgetItem *item);
Expand Down

0 comments on commit 6691a06

Please sign in to comment.