diff --git a/src/internet/groovesharkservice.cpp b/src/internet/groovesharkservice.cpp index 8f2bb6c77..2b6e5bf9f 100644 --- a/src/internet/groovesharkservice.cpp +++ b/src/internet/groovesharkservice.cpp @@ -85,6 +85,7 @@ GroovesharkService::GroovesharkService(InternetModel *parent) popular_month_(NULL), popular_today_(NULL), favorites_(NULL), + subscribed_playlists_divider_(NULL), network_(new NetworkAccessManager(this)), context_menu_(NULL), remove_from_playlist_(NULL), @@ -429,7 +430,9 @@ void GroovesharkService::Logout() { popular_month_ = NULL; popular_today_ = NULL; favorites_ = NULL; + subscribed_playlists_divider_ = NULL; playlists_.clear(); + subscribed_playlists_.clear(); } void GroovesharkService::ResetSessionId() { @@ -459,7 +462,7 @@ void GroovesharkService::ShowContextMenu(const QModelIndex& index, const QPoint& int parent_playlist_type = index.parent().data(Role_PlaylistType).toInt(); if (parent_playlist_type == UserFavorites) display_remove_from_favorites_action = true; - else + else if (parent_playlist_type == UserPlaylist) display_remove_from_playlist_action = true; } delete_playlist_->setVisible(display_delete_playlist_action); @@ -546,8 +549,13 @@ void GroovesharkService::EnsureItemsCreated() { InternetModel::Role_PlayBehaviour); root_->appendRow(favorites_); + subscribed_playlists_divider_ = new QStandardItem(tr("Subscribed playlists")); + subscribed_playlists_divider_->setData(true, InternetModel::Role_IsDivider); + root_->appendRow(subscribed_playlists_divider_); + RetrieveUserFavorites(); RetrieveUserPlaylists(); + RetrieveSubscribedPlaylists(); RetrievePopularSongs(); } } @@ -612,8 +620,12 @@ void GroovesharkService::PlaylistSongsRetrieved() { PlaylistInfo playlist_info = pending_retrieve_playlists_.take(reply); // Get the playlist item (in case of refresh) or create a new one QStandardItem* item = NULL; + PlaylistType playlist_type = UserPlaylist; if (playlists_.contains(playlist_info.id_)) { item = playlists_[playlist_info.id_].item_; + } else if (subscribed_playlists_.contains(playlist_info.id_)) { + item = subscribed_playlists_[playlist_info.id_].item_; + playlist_type = SubscribedPlaylist; } bool item_already_exists = false; if (item) { @@ -637,13 +649,18 @@ void GroovesharkService::PlaylistSongsRetrieved() { item->appendRow(child); } if (!item_already_exists) { - root_->appendRow(item); + // Insert this new item just below the favorites list + root_->insertRow(favorites_->row() + 1, item); } // Keep in mind this playlist playlist_info.songs_ids_ = ExtractSongsIds(result); playlist_info.item_ = item; - playlists_.insert(playlist_info.id_, playlist_info); + if (playlist_type == SubscribedPlaylist) { + subscribed_playlists_.insert(playlist_info.id_, playlist_info); + } else { + playlists_.insert(playlist_info.id_, playlist_info); + } if (pending_retrieve_playlists_.isEmpty()) { model()->task_manager()->SetTaskFinished(task_playlists_id_); @@ -742,6 +759,37 @@ void GroovesharkService::PopularSongsTodayRetrieved(QNetworkReply* reply) { } } +void GroovesharkService::RetrieveSubscribedPlaylists() { + QNetworkReply* reply = CreateRequest("getUserPlaylistsSubscribed", QList<Param>()); + NewClosure(reply, SIGNAL(finished()), + this, SLOT(SubscribedPlaylistsRetrieved(QNetworkReply*)), reply); +} + +void GroovesharkService::SubscribedPlaylistsRetrieved(QNetworkReply* reply) { + reply->deleteLater(); + QVariantMap result = ExtractResult(reply); + QVariantList playlists = result["playlists"].toList(); + QVariantList::iterator it; + for (it = playlists.begin(); it != playlists.end(); ++it) { + // Get playlist info + QVariantMap playlist = (*it).toMap(); + int playlist_id = playlist["PlaylistID"].toInt(); + QString playlist_name = playlist["PlaylistName"].toString(); + + QStandardItem* playlist_item = CreatePlaylistItem(playlist_name, playlist_id); + // Refine some playlist properties that should be different for subscribed + // playlists + playlist_item->setData(SubscribedPlaylist, Role_PlaylistType); + playlist_item->setData(false, InternetModel::Role_CanBeModified); + PlaylistInfo playlist_info(playlist_id, playlist_name, playlist_item); + subscribed_playlists_.insert(playlist_id, playlist_info); + root_->insertRow(subscribed_playlists_divider_->row() + 1, playlist_item); + + // Request playlist's songs + RefreshPlaylist(playlist_id, playlist_name); + } +} + void GroovesharkService::MarkStreamKeyOver30Secs(const QString& stream_key, const QString& server_id) { QList<Param> parameters; diff --git a/src/internet/groovesharkservice.h b/src/internet/groovesharkservice.h index 4c9c05006..0e27eafad 100644 --- a/src/internet/groovesharkservice.h +++ b/src/internet/groovesharkservice.h @@ -48,7 +48,8 @@ class GroovesharkService : public InternetService { UserPlaylist = Qt::UserRole, // Favorites list is like a playlist, but we want to do special treatments // in some cases - UserFavorites + UserFavorites, + SubscribedPlaylist }; // Values are persisted - don't change. @@ -81,6 +82,7 @@ class GroovesharkService : public InternetService { void RetrievePopularSongs(); void RetrievePopularSongsMonth(); void RetrievePopularSongsToday(); + void RetrieveSubscribedPlaylists(); void SetPlaylistSongs(int playlist_id, const QList<int>& songs_ids); void RemoveFromPlaylist(int playlist_id, int song_id); // Refresh playlist_id playlist , or create it if it doesn't exist @@ -118,8 +120,8 @@ class GroovesharkService : public InternetService { struct PlaylistInfo { PlaylistInfo() {} - PlaylistInfo(int id, QString name) - : id_(id), name_(name), item_(NULL) {} + PlaylistInfo(int id, QString name, QStandardItem* item = NULL) + : id_(id), name_(name), item_(item) {} int id_; QString name_; @@ -142,6 +144,7 @@ class GroovesharkService : public InternetService { void UserFavoritesRetrieved(QNetworkReply* reply, int task_id); void PopularSongsMonthRetrieved(QNetworkReply* reply); void PopularSongsTodayRetrieved(QNetworkReply* reply); + void SubscribedPlaylistsRetrieved(QNetworkReply* reply); void PlaylistSongsRetrieved(); void PlaylistSongsSet(QNetworkReply* reply, int playlist_id, int task_id); void CreateNewPlaylist(); @@ -201,12 +204,14 @@ class GroovesharkService : public InternetService { QMap<QNetworkReply*, PlaylistInfo> pending_retrieve_playlists_; QMap<int, PlaylistInfo> playlists_; + QMap<int, PlaylistInfo> subscribed_playlists_; QStandardItem* root_; QStandardItem* search_; QStandardItem* popular_month_; QStandardItem* popular_today_; QStandardItem* favorites_; + QStandardItem* subscribed_playlists_divider_; NetworkAccessManager* network_; diff --git a/src/translations/translations.pot b/src/translations/translations.pot index 0eaa5418e..d8b30e0ec 100644 --- a/src/translations/translations.pot +++ b/src/translations/translations.pot @@ -213,11 +213,7 @@ msgstr "" msgid "1 track" msgstr "" -#: ui_magnatunedownloaddialog.h:143 -msgid "128K MP3" -msgstr "" - -#: ui_magnatunesettingspage.h:170 +#: ui_magnatunedownloaddialog.h:143 ui_magnatunesettingspage.h:170 msgid "128k MP3" msgstr "" @@ -241,7 +237,7 @@ msgstr "" msgid "A Grooveshark Anywhere account is required." msgstr "" -#: internet/spotifysettingspage.cpp:147 +#: internet/spotifysettingspage.cpp:145 msgid "A Spotify Premium account is required." msgstr "" @@ -419,11 +415,11 @@ msgstr "" msgid "Add stream..." msgstr "" -#: internet/groovesharkservice.cpp:840 +#: internet/groovesharkservice.cpp:905 msgid "Add to Grooveshark favorites" msgstr "" -#: internet/groovesharkservice.cpp:846 +#: internet/groovesharkservice.cpp:911 msgid "Add to Grooveshark playlists" msgstr "" @@ -467,7 +463,7 @@ msgstr "" msgid "Added within three months" msgstr "" -#: internet/groovesharkservice.cpp:1038 +#: internet/groovesharkservice.cpp:1103 msgid "Adding song to favorites" msgstr "" @@ -479,7 +475,7 @@ msgstr "" msgid "After copying..." msgstr "" -#: playlist/playlist.cpp:1099 ui/organisedialog.cpp:52 +#: playlist/playlist.cpp:1103 ui/organisedialog.cpp:52 #: ui/qtsystemtrayicon.cpp:252 ui_groupbydialog.h:129 ui_groupbydialog.h:142 #: ui_groupbydialog.h:155 ui_albumcoversearcher.h:110 #: ui_albumcoversearcher.h:112 ui_edittagdialog.h:656 @@ -491,7 +487,7 @@ msgstr "" msgid "Album (ideal loudness for all tracks)" msgstr "" -#: playlist/playlist.cpp:1105 ui/organisedialog.cpp:55 ui_edittagdialog.h:658 +#: playlist/playlist.cpp:1109 ui/organisedialog.cpp:55 ui_edittagdialog.h:658 msgid "Album artist" msgstr "" @@ -622,7 +618,7 @@ msgstr "" msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" -#: internet/groovesharkservice.cpp:1010 +#: internet/groovesharkservice.cpp:1075 msgid "Are you sure you want to delete this playlist?" msgstr "" @@ -630,7 +626,7 @@ msgstr "" msgid "Are you sure you want to reset this song's statistics?" msgstr "" -#: playlist/playlist.cpp:1098 ui/organisedialog.cpp:53 +#: playlist/playlist.cpp:1102 ui/organisedialog.cpp:53 #: ui/qtsystemtrayicon.cpp:250 ui_groupbydialog.h:130 ui_groupbydialog.h:143 #: ui_groupbydialog.h:156 ui_albumcoversearcher.h:106 #: ui_albumcoversearcher.h:108 ui_edittagdialog.h:654 @@ -696,7 +692,7 @@ msgstr "" msgid "Average image size" msgstr "" -#: playlist/playlist.cpp:1114 ui/organisedialog.cpp:59 ui_edittagdialog.h:638 +#: playlist/playlist.cpp:1118 ui/organisedialog.cpp:59 ui_edittagdialog.h:638 msgid "BPM" msgstr "" @@ -741,7 +737,7 @@ msgstr "" msgid "Biography from %1" msgstr "" -#: playlist/playlist.cpp:1115 ui_edittagdialog.h:640 +#: playlist/playlist.cpp:1119 ui_edittagdialog.h:640 msgid "Bit rate" msgstr "" @@ -958,7 +954,7 @@ msgstr "" msgid "Comma separated list of class:level, level is 0-3" msgstr "" -#: playlist/playlist.cpp:1124 smartplaylists/searchterm.cpp:279 +#: playlist/playlist.cpp:1128 smartplaylists/searchterm.cpp:279 #: ui/organisedialog.cpp:62 ui_edittagdialog.h:661 msgid "Comment" msgstr "" @@ -971,12 +967,12 @@ msgstr "" msgid "Complete tags automatically..." msgstr "" -#: playlist/playlist.cpp:1106 ui/organisedialog.cpp:56 ui_groupbydialog.h:132 +#: playlist/playlist.cpp:1110 ui/organisedialog.cpp:56 ui_groupbydialog.h:132 #: ui_groupbydialog.h:145 ui_groupbydialog.h:158 ui_edittagdialog.h:659 msgid "Composer" msgstr "" -#: internet/groovesharkservice.cpp:492 +#: internet/groovesharkservice.cpp:504 msgid "Configure Grooveshark..." msgstr "" @@ -1029,7 +1025,7 @@ msgstr "" msgid "Convert any music that the device can't play" msgstr "" -#: internet/groovesharkservice.cpp:893 +#: internet/groovesharkservice.cpp:958 msgid "Copy to clipboard" msgstr "" @@ -1108,7 +1104,7 @@ msgstr "" msgid "Covers from %1" msgstr "" -#: internet/groovesharkservice.cpp:477 internet/groovesharkservice.cpp:962 +#: internet/groovesharkservice.cpp:488 internet/groovesharkservice.cpp:1027 msgid "Create a new Grooveshark playlist" msgstr "" @@ -1216,11 +1212,11 @@ msgstr "" msgid "Dance" msgstr "" -#: playlist/playlist.cpp:1122 ui_edittagdialog.h:649 +#: playlist/playlist.cpp:1126 ui_edittagdialog.h:649 msgid "Date created" msgstr "" -#: playlist/playlist.cpp:1121 ui_edittagdialog.h:648 +#: playlist/playlist.cpp:1125 ui_edittagdialog.h:648 msgid "Date modified" msgstr "" @@ -1248,7 +1244,7 @@ msgstr "" msgid "Delay between visualizations" msgstr "" -#: internet/groovesharkservice.cpp:480 internet/groovesharkservice.cpp:1009 +#: internet/groovesharkservice.cpp:491 internet/groovesharkservice.cpp:1074 msgid "Delete Grooveshark playlist" msgstr "" @@ -1354,7 +1350,7 @@ msgstr "" msgid "Disabled" msgstr "" -#: playlist/playlist.cpp:1102 ui/organisedialog.cpp:58 ui_edittagdialog.h:655 +#: playlist/playlist.cpp:1106 ui/organisedialog.cpp:58 ui_edittagdialog.h:655 msgid "Disc" msgstr "" @@ -1675,7 +1671,7 @@ msgstr "" msgid "Fast" msgstr "" -#: internet/groovesharkservice.cpp:524 +#: internet/groovesharkservice.cpp:543 msgid "Favorites" msgstr "" @@ -1707,19 +1703,19 @@ msgstr "" msgid "File formats" msgstr "" -#: playlist/playlist.cpp:1117 ui_edittagdialog.h:650 +#: playlist/playlist.cpp:1121 ui_edittagdialog.h:650 msgid "File name" msgstr "" -#: playlist/playlist.cpp:1118 +#: playlist/playlist.cpp:1122 msgid "File name (without path)" msgstr "" -#: playlist/playlist.cpp:1119 ui_edittagdialog.h:644 +#: playlist/playlist.cpp:1123 ui_edittagdialog.h:644 msgid "File size" msgstr "" -#: playlist/playlist.cpp:1120 ui_groupbydialog.h:133 ui_groupbydialog.h:146 +#: playlist/playlist.cpp:1124 ui_groupbydialog.h:133 ui_groupbydialog.h:146 #: ui_groupbydialog.h:159 ui_edittagdialog.h:646 msgid "File type" msgstr "" @@ -1845,16 +1841,16 @@ msgstr "" msgid "General settings" msgstr "" -#: playlist/playlist.cpp:1104 ui/organisedialog.cpp:61 ui_groupbydialog.h:134 +#: playlist/playlist.cpp:1108 ui/organisedialog.cpp:61 ui_groupbydialog.h:134 #: ui_groupbydialog.h:147 ui_groupbydialog.h:160 ui_edittagdialog.h:660 msgid "Genre" msgstr "" -#: internet/groovesharkservice.cpp:857 +#: internet/groovesharkservice.cpp:922 msgid "Get an URL to share this Grooveshark song" msgstr "" -#: internet/groovesharkservice.cpp:667 +#: internet/groovesharkservice.cpp:701 msgid "Getting Grooveshark popular songs" msgstr "" @@ -1900,11 +1896,11 @@ msgstr "" msgid "Grooveshark" msgstr "" -#: internet/groovesharkservice.cpp:404 +#: internet/groovesharkservice.cpp:413 msgid "Grooveshark login error" msgstr "" -#: internet/groovesharkservice.cpp:889 +#: internet/groovesharkservice.cpp:954 msgid "Grooveshark song's URL" msgstr "" @@ -2099,7 +2095,7 @@ msgstr "" msgid "Invalid session key" msgstr "" -#: internet/groovesharkservice.cpp:397 +#: internet/groovesharkservice.cpp:406 msgid "Invalid username and/or password" msgstr "" @@ -2174,7 +2170,7 @@ msgstr "" msgid "Large sidebar" msgstr "" -#: library/library.cpp:66 playlist/playlist.cpp:1111 ui_edittagdialog.h:641 +#: library/library.cpp:66 playlist/playlist.cpp:1115 ui_edittagdialog.h:641 msgid "Last played" msgstr "" @@ -2252,7 +2248,7 @@ msgstr "" msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" -#: playlist/playlist.cpp:1100 ui/organisedialog.cpp:63 +#: playlist/playlist.cpp:1104 ui/organisedialog.cpp:63 #: ui/qtsystemtrayicon.cpp:255 ui_edittagdialog.h:636 msgid "Length" msgstr "" @@ -2567,7 +2563,7 @@ msgstr "" msgid "My Recommendations" msgstr "" -#: internet/groovesharkservice.cpp:963 ui/equalizer.cpp:172 +#: internet/groovesharkservice.cpp:1028 ui/equalizer.cpp:172 #: ui_deviceproperties.h:369 ui_magnatunedownloaddialog.h:135 #: ui_wizardfinishpage.h:84 ui_globalshortcutssettingspage.h:174 msgid "Name" @@ -2733,7 +2729,7 @@ msgid "Only show the first" msgstr "" #: internet/digitallyimportedservicebase.cpp:178 -#: internet/groovesharkservice.cpp:493 internet/icecastservice.cpp:300 +#: internet/groovesharkservice.cpp:503 internet/icecastservice.cpp:300 #: internet/jamendoservice.cpp:414 internet/magnatuneservice.cpp:271 #: internet/somafmservice.cpp:84 #, qt-format @@ -2863,7 +2859,7 @@ msgstr "" msgid "Play artist radio..." msgstr "" -#: playlist/playlist.cpp:1109 ui_edittagdialog.h:637 +#: playlist/playlist.cpp:1113 ui_edittagdialog.h:637 msgid "Play count" msgstr "" @@ -2924,6 +2920,10 @@ msgstr "" msgid "Playlist type" msgstr "" +#: internet/groovesharkservice.cpp:539 +msgid "Playlists" +msgstr "" + #: ui_spotifysettingspage.h:185 msgid "Plugin status:" msgstr "" @@ -2932,11 +2932,15 @@ msgstr "" msgid "Pop" msgstr "" -#: internet/groovesharkservice.cpp:510 +#: internet/groovesharkservice.cpp:521 +msgid "Popular songs" +msgstr "" + +#: internet/groovesharkservice.cpp:525 msgid "Popular songs of the Month" msgstr "" -#: internet/groovesharkservice.cpp:517 +#: internet/groovesharkservice.cpp:532 msgid "Popular songs today" msgstr "" @@ -3091,7 +3095,7 @@ msgstr "" msgid "Rate the current song 5 stars" msgstr "" -#: playlist/playlist.cpp:1108 ui_edittagdialog.h:645 +#: playlist/playlist.cpp:1112 ui_edittagdialog.h:645 msgid "Rating" msgstr "" @@ -3148,11 +3152,11 @@ msgstr "" msgid "Remove folder" msgstr "" -#: internet/groovesharkservice.cpp:487 +#: internet/groovesharkservice.cpp:498 msgid "Remove from favorites" msgstr "" -#: internet/groovesharkservice.cpp:484 ui_mainwindow.h:674 +#: internet/groovesharkservice.cpp:495 ui_mainwindow.h:674 msgid "Remove from playlist" msgstr "" @@ -3160,7 +3164,7 @@ msgstr "" msgid "Remove playlist" msgstr "" -#: internet/groovesharkservice.cpp:1096 +#: internet/groovesharkservice.cpp:1161 msgid "Removing song from favorites" msgstr "" @@ -3238,11 +3242,11 @@ msgstr "" msgid "Results" msgstr "" -#: internet/groovesharkservice.cpp:638 +#: internet/groovesharkservice.cpp:672 msgid "Retrieving Grooveshark favorites songs" msgstr "" -#: internet/groovesharkservice.cpp:560 +#: internet/groovesharkservice.cpp:585 msgid "Retrieving Grooveshark playlists" msgstr "" @@ -3262,7 +3266,7 @@ msgstr "" msgid "Safely remove the device after copying" msgstr "" -#: playlist/playlist.cpp:1116 ui_edittagdialog.h:642 +#: playlist/playlist.cpp:1120 ui_edittagdialog.h:642 msgid "Sample rate" msgstr "" @@ -3306,7 +3310,7 @@ msgstr "" msgid "Scalable sampling rate profile (SSR)" msgstr "" -#: playlist/playlist.cpp:1112 ui_edittagdialog.h:643 +#: playlist/playlist.cpp:1116 ui_edittagdialog.h:643 msgid "Score" msgstr "" @@ -3319,11 +3323,11 @@ msgid "Search" msgstr "" #: internet/groovesharksearchplaylisttype.cpp:32 -#: internet/groovesharkservice.cpp:775 +#: internet/groovesharkservice.cpp:840 msgid "Search Grooveshark" msgstr "" -#: internet/groovesharkservice.cpp:490 internet/groovesharkservice.cpp:504 +#: internet/groovesharkservice.cpp:501 internet/groovesharkservice.cpp:515 msgid "Search Grooveshark (opens a new tab)" msgstr "" @@ -3375,7 +3379,7 @@ msgstr "" msgid "Search terms" msgstr "" -#: internet/groovesharkservice.cpp:264 +#: internet/groovesharkservice.cpp:273 msgid "Searching on Grooveshark" msgstr "" @@ -3594,7 +3598,7 @@ msgstr "" msgid "Skip backwards in playlist" msgstr "" -#: playlist/playlist.cpp:1110 ui_edittagdialog.h:639 +#: playlist/playlist.cpp:1114 ui_edittagdialog.h:639 msgid "Skip count" msgstr "" @@ -3750,6 +3754,10 @@ msgstr "" msgid "Streaming membership" msgstr "" +#: internet/groovesharkservice.cpp:552 +msgid "Subscribed playlists" +msgstr "" + #: transcoder/transcoder.cpp:198 #, qt-format msgid "Successfully written %1" @@ -3960,7 +3968,7 @@ msgstr "" msgid "Timezone" msgstr "" -#: playlist/playlist.cpp:1097 ui/organisedialog.cpp:51 +#: playlist/playlist.cpp:1101 ui/organisedialog.cpp:51 #: ui/qtsystemtrayicon.cpp:248 ui_about.h:142 ui_edittagdialog.h:652 #: ui_trackselectiondialog.h:211 msgid "Title" @@ -3998,7 +4006,7 @@ msgstr "" msgid "Total network requests made" msgstr "" -#: playlist/playlist.cpp:1101 ui/organisedialog.cpp:57 ui_edittagdialog.h:653 +#: playlist/playlist.cpp:1105 ui/organisedialog.cpp:57 ui_edittagdialog.h:653 #: ui_trackselectiondialog.h:212 msgid "Track" msgstr "" @@ -4069,7 +4077,7 @@ msgstr "" msgid "Unset cover" msgstr "" -#: internet/groovesharkservice.cpp:917 +#: internet/groovesharkservice.cpp:982 msgid "Update Grooveshark playlist" msgstr "" @@ -4147,7 +4155,7 @@ msgstr "" msgid "Used" msgstr "" -#: internet/groovesharkservice.cpp:400 +#: internet/groovesharkservice.cpp:409 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" @@ -4305,7 +4313,7 @@ msgstr "" msgid "Would you like to run a full rescan right now?" msgstr "" -#: playlist/playlist.cpp:1103 ui/organisedialog.cpp:60 ui_groupbydialog.h:135 +#: playlist/playlist.cpp:1107 ui/organisedialog.cpp:60 ui_groupbydialog.h:135 #: ui_groupbydialog.h:148 ui_groupbydialog.h:161 ui_edittagdialog.h:657 msgid "Year" msgstr "" @@ -4376,7 +4384,7 @@ msgstr "" msgid "You do not have a Grooveshark Anywhere account." msgstr "" -#: internet/spotifysettingspage.cpp:138 +#: internet/spotifysettingspage.cpp:136 msgid "You do not have a Spotify Premium account." msgstr "" @@ -4439,7 +4447,7 @@ msgid "Your scrobbles: %1" msgstr "" #: internet/groovesharksettingspage.cpp:109 -#: internet/spotifysettingspage.cpp:143 +#: internet/spotifysettingspage.cpp:141 msgid "Your username or password was incorrect." msgstr ""