Create and delete Grooveshark playlists
This commit is contained in:
parent
33abc40bf5
commit
034db5d18b
@ -17,6 +17,9 @@
|
|||||||
|
|
||||||
#include "groovesharkservice.h"
|
#include "groovesharkservice.h"
|
||||||
|
|
||||||
|
#include <boost/scoped_ptr.hpp>
|
||||||
|
|
||||||
|
#include <QInputDialog>
|
||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QMimeData>
|
#include <QMimeData>
|
||||||
@ -410,8 +413,13 @@ void GroovesharkService::ShowContextMenu(const QModelIndex& index, const QPoint&
|
|||||||
EnsureMenuCreated();
|
EnsureMenuCreated();
|
||||||
|
|
||||||
// Check if we should display actions
|
// Check if we should display actions
|
||||||
bool display_remove_from_playlist_action = false,
|
bool display_delete_playlist_action = false,
|
||||||
display_remove_from_favorites_action = false;
|
display_remove_from_playlist_action = false,
|
||||||
|
display_remove_from_favorites_action = false;
|
||||||
|
|
||||||
|
if (index.data(InternetModel::Role_Type).toInt() == InternetModel::Type_UserPlaylist) {
|
||||||
|
display_delete_playlist_action = true;
|
||||||
|
}
|
||||||
// We check parent's type (instead of index type) because we want to enable
|
// We check parent's type (instead of index type) because we want to enable
|
||||||
// 'remove' actions for items which are inside a playlist
|
// 'remove' actions for items which are inside a playlist
|
||||||
int parent_type = index.parent().data(InternetModel::Role_Type).toInt();
|
int parent_type = index.parent().data(InternetModel::Role_Type).toInt();
|
||||||
@ -420,6 +428,7 @@ void GroovesharkService::ShowContextMenu(const QModelIndex& index, const QPoint&
|
|||||||
} else if (parent_type == Type_UserFavorites) {
|
} else if (parent_type == Type_UserFavorites) {
|
||||||
display_remove_from_favorites_action = true;
|
display_remove_from_favorites_action = true;
|
||||||
}
|
}
|
||||||
|
delete_playlist_->setVisible(display_delete_playlist_action);
|
||||||
remove_from_playlist_->setVisible(display_remove_from_playlist_action);
|
remove_from_playlist_->setVisible(display_remove_from_playlist_action);
|
||||||
remove_from_favorites_->setVisible(display_remove_from_favorites_action);
|
remove_from_favorites_->setVisible(display_remove_from_favorites_action);
|
||||||
|
|
||||||
@ -438,6 +447,13 @@ void GroovesharkService::EnsureMenuCreated() {
|
|||||||
if(!context_menu_) {
|
if(!context_menu_) {
|
||||||
context_menu_ = new QMenu;
|
context_menu_ = new QMenu;
|
||||||
context_menu_->addActions(GetPlaylistActions());
|
context_menu_->addActions(GetPlaylistActions());
|
||||||
|
create_playlist_ = context_menu_->addAction(
|
||||||
|
IconLoader::Load("list-add"), tr("Create a new Grooveshark playlist"),
|
||||||
|
this, SLOT(CreateNewPlaylist()));
|
||||||
|
delete_playlist_ = context_menu_->addAction(
|
||||||
|
IconLoader::Load("edit-delete"), tr("Delete Grooveshark playlist"),
|
||||||
|
this, SLOT(DeleteCurrentPlaylist()));
|
||||||
|
context_menu_->addSeparator();
|
||||||
remove_from_playlist_ = context_menu_->addAction(
|
remove_from_playlist_ = context_menu_->addAction(
|
||||||
IconLoader::Load("list-remove"), tr("Remove from playlist"),
|
IconLoader::Load("list-remove"), tr("Remove from playlist"),
|
||||||
this, SLOT(RemoveCurrentFromPlaylist()));
|
this, SLOT(RemoveCurrentFromPlaylist()));
|
||||||
@ -472,6 +488,17 @@ void GroovesharkService::EnsureConnected() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QStandardItem* GroovesharkService::CreatePlaylistItem(const QString& playlist_name,
|
||||||
|
int playlist_id) {
|
||||||
|
QStandardItem* item = new QStandardItem(playlist_name);
|
||||||
|
item->setData(InternetModel::Type_UserPlaylist, InternetModel::Role_Type);
|
||||||
|
item->setData(true, InternetModel::Role_CanLazyLoad);
|
||||||
|
item->setData(true, InternetModel::Role_CanBeModified);
|
||||||
|
item->setData(InternetModel::PlayBehaviour_SingleItem, InternetModel::Role_PlayBehaviour);
|
||||||
|
item->setData(playlist_id, Role_UserPlaylistId);
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
void GroovesharkService::RetrieveUserPlaylists() {
|
void GroovesharkService::RetrieveUserPlaylists() {
|
||||||
QNetworkReply* reply = CreateRequest("getUserPlaylists", QList<Param>(), true);
|
QNetworkReply* reply = CreateRequest("getUserPlaylists", QList<Param>(), true);
|
||||||
|
|
||||||
@ -516,12 +543,7 @@ void GroovesharkService::PlaylistSongsRetrieved() {
|
|||||||
if (item) {
|
if (item) {
|
||||||
item->removeRows(0, item->rowCount());
|
item->removeRows(0, item->rowCount());
|
||||||
} else {
|
} else {
|
||||||
item = new QStandardItem(playlist_info.name_);
|
item = CreatePlaylistItem(playlist_info.name_, playlist_info.id_);
|
||||||
item->setData(InternetModel::Type_UserPlaylist, InternetModel::Role_Type);
|
|
||||||
item->setData(true, InternetModel::Role_CanLazyLoad);
|
|
||||||
item->setData(true, InternetModel::Role_CanBeModified);
|
|
||||||
item->setData(InternetModel::PlayBehaviour_SingleItem, InternetModel::Role_PlayBehaviour);
|
|
||||||
item->setData(playlist_info.id_, Role_UserPlaylistId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariantMap result = ExtractResult(reply);
|
QVariantMap result = ExtractResult(reply);
|
||||||
@ -721,6 +743,83 @@ void GroovesharkService::RefreshPlaylist(int playlist_id, const QString& playlis
|
|||||||
pending_retrieve_playlists_.insert(reply, PlaylistInfo(playlist_id, playlist_name));
|
pending_retrieve_playlists_.insert(reply, PlaylistInfo(playlist_id, playlist_name));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GroovesharkService::CreateNewPlaylist() {
|
||||||
|
QString name = QInputDialog::getText(NULL,
|
||||||
|
tr("Create a new Grooveshark playlist"),
|
||||||
|
tr("Name"),
|
||||||
|
QLineEdit::Normal);
|
||||||
|
if (name.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<Param> parameters;
|
||||||
|
parameters << Param("name", name)
|
||||||
|
<< Param("songIDs", QVariantList());
|
||||||
|
QNetworkReply* reply = CreateRequest("createPlaylist", parameters, true);
|
||||||
|
NewClosure(reply, SIGNAL(finished()),
|
||||||
|
this, SLOT(NewPlaylistCreated(QNetworkReply*, const QString&)), reply, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GroovesharkService::NewPlaylistCreated(QNetworkReply* reply, const QString& name) {
|
||||||
|
reply->deleteLater();
|
||||||
|
QVariantMap result = ExtractResult(reply);
|
||||||
|
if (!result["success"].toBool() || !result["playlistID"].isValid()) {
|
||||||
|
qLog(Warning) << "Grooveshark createPlaylist failed";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int playlist_id = result["playlistID"].toInt();
|
||||||
|
QStandardItem* new_playlist_item = CreatePlaylistItem(name, playlist_id);
|
||||||
|
PlaylistInfo playlist_info(playlist_id, name);
|
||||||
|
playlist_info.item_ = new_playlist_item;
|
||||||
|
root_->appendRow(new_playlist_item);
|
||||||
|
playlists_.insert(playlist_id, playlist_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GroovesharkService::DeleteCurrentPlaylist() {
|
||||||
|
if (context_item_.data(InternetModel::Role_Type).toInt() !=
|
||||||
|
InternetModel::Type_UserPlaylist) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int playlist_id = context_item_.data(Role_UserPlaylistId).toInt();
|
||||||
|
DeletePlaylist(playlist_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GroovesharkService::DeletePlaylist(int playlist_id) {
|
||||||
|
if (!playlists_.contains(playlist_id)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
boost::scoped_ptr<QMessageBox> confirmation_dialog(new QMessageBox(
|
||||||
|
QMessageBox::Question, tr("Delete Grooveshark playlist"),
|
||||||
|
tr("Are you sure you want to delete this playlist?"),
|
||||||
|
QMessageBox::Yes | QMessageBox::Cancel));
|
||||||
|
if (confirmation_dialog->exec() != QMessageBox::Yes) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<Param> parameters;
|
||||||
|
parameters << Param("playlistID", playlist_id);
|
||||||
|
QNetworkReply* reply = CreateRequest("deletePlaylist", parameters, true);
|
||||||
|
NewClosure(reply, SIGNAL(finished()),
|
||||||
|
this, SLOT(PlaylistDeleted(QNetworkReply*, int)), reply, playlist_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GroovesharkService::PlaylistDeleted(QNetworkReply* reply, int playlist_id) {
|
||||||
|
reply->deleteLater();
|
||||||
|
QVariantMap result = ExtractResult(reply);
|
||||||
|
if (!result["success"].toBool()) {
|
||||||
|
qLog(Warning) << "Grooveshark deletePlaylist failed";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!playlists_.contains(playlist_id)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
PlaylistInfo playlist_info = playlists_.take(playlist_id);
|
||||||
|
root_->removeRow(playlist_info.item_->row());
|
||||||
|
}
|
||||||
|
|
||||||
void GroovesharkService::AddUserFavoriteSong(int song_id) {
|
void GroovesharkService::AddUserFavoriteSong(int song_id) {
|
||||||
QList<Param> parameters;
|
QList<Param> parameters;
|
||||||
parameters << Param("songID", song_id);
|
parameters << Param("songID", song_id);
|
||||||
|
@ -74,6 +74,7 @@ class GroovesharkService : public InternetService {
|
|||||||
void RemoveFromPlaylist(int playlist_id, int song_id);
|
void RemoveFromPlaylist(int playlist_id, int song_id);
|
||||||
// Refresh playlist_id playlist , or create it if it doesn't exist
|
// Refresh playlist_id playlist , or create it if it doesn't exist
|
||||||
void RefreshPlaylist(int playlist_id, const QString& playlist_name);
|
void RefreshPlaylist(int playlist_id, const QString& playlist_name);
|
||||||
|
void DeletePlaylist(int playlist_id);
|
||||||
void AddUserFavoriteSong(int song_id);
|
void AddUserFavoriteSong(int song_id);
|
||||||
void RemoveFromFavorites(int song_id);
|
void RemoveFromFavorites(int song_id);
|
||||||
void MarkStreamKeyOver30Secs(const QString& stream_key, const QString& server_id);
|
void MarkStreamKeyOver30Secs(const QString& stream_key, const QString& server_id);
|
||||||
@ -129,6 +130,10 @@ class GroovesharkService : public InternetService {
|
|||||||
void UserFavoritesRetrieved();
|
void UserFavoritesRetrieved();
|
||||||
void PlaylistSongsRetrieved();
|
void PlaylistSongsRetrieved();
|
||||||
void PlaylistSongsSet(QNetworkReply* reply, int playlist_id);
|
void PlaylistSongsSet(QNetworkReply* reply, int playlist_id);
|
||||||
|
void CreateNewPlaylist();
|
||||||
|
void NewPlaylistCreated(QNetworkReply* reply, const QString& name);
|
||||||
|
void DeleteCurrentPlaylist();
|
||||||
|
void PlaylistDeleted(QNetworkReply* reply, int playlist_id);
|
||||||
void UserFavoriteSongAdded(QNetworkReply* reply);
|
void UserFavoriteSongAdded(QNetworkReply* reply);
|
||||||
void RemoveCurrentFromPlaylist();
|
void RemoveCurrentFromPlaylist();
|
||||||
void RemoveCurrentFromFavorites();
|
void RemoveCurrentFromFavorites();
|
||||||
@ -142,6 +147,10 @@ class GroovesharkService : public InternetService {
|
|||||||
void EnsureItemsCreated();
|
void EnsureItemsCreated();
|
||||||
void EnsureConnected();
|
void EnsureConnected();
|
||||||
|
|
||||||
|
// Create a playlist item, with data set as excepted. Doesn't fill the item
|
||||||
|
// with songs rows.
|
||||||
|
QStandardItem* CreatePlaylistItem(const QString& playlist_name, int playlist_id);
|
||||||
|
|
||||||
void AuthenticateSession();
|
void AuthenticateSession();
|
||||||
void InitCountry();
|
void InitCountry();
|
||||||
|
|
||||||
@ -184,6 +193,8 @@ class GroovesharkService : public InternetService {
|
|||||||
QMenu* context_menu_;
|
QMenu* context_menu_;
|
||||||
QModelIndex context_item_;
|
QModelIndex context_item_;
|
||||||
|
|
||||||
|
QAction* create_playlist_;
|
||||||
|
QAction* delete_playlist_;
|
||||||
QAction* remove_from_playlist_;
|
QAction* remove_from_playlist_;
|
||||||
QAction* remove_from_favorites_;
|
QAction* remove_from_favorites_;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user