bool Addon_music_spotify::getAlbumTracksFromTrack(CFileItemList& items, CStdString& uri) { if (isReady()) { sp_link *spLink = sp_link_create_from_string(uri.Left(uri.Find('.'))); if (!spLink) return false; sp_track *spTrack = sp_link_as_track(spLink); if (spTrack) { sp_album* spAlbum = sp_track_album(spTrack); if (spAlbum) { // TODO find out on what disc the track is if its a multidisc SxAlbum* album = AlbumStore::getInstance()->getAlbum(spAlbum, true); // this is NOT nice, might result in a race condition... fix later while (!album->isLoaded()) { Session::getInstance()->processEvents(); } vector<SxTrack*> tracks = album->getTracks(); for (int i = 0; i < tracks.size(); i++) { items.Add(Utils::SxTrackToItem(tracks[i])); } } sp_track_release(spTrack); } sp_link_release(spLink); } }
bool Addon_music_spotify::ToggleStarAlbum(CFileItemPtr& item) { if (isReady()) { Logger::printOut("toggle album star addon"); CURL url(item->GetPath()); CStdString uri = url.GetFileNameWithoutPath(); sp_album *spAlbum = NULL; if (uri.Left(13).Equals("spotify:album")) { uri = uri.Left(uri.Find('#')); sp_link* spLink = sp_link_create_from_string(uri); spAlbum = sp_link_as_album(spLink); sp_link_release(spLink); } else if (uri.Left(13).Equals("spotify:track")) { sp_link *spLink = sp_link_create_from_string(uri.Left(uri.Find('.'))); if (!spLink) return true; sp_track *spTrack = sp_link_as_track(spLink); sp_link_release(spLink); if (spTrack) { spAlbum = sp_track_album(spTrack); } sp_track_release(spTrack); } else { return true; } SxAlbum* salbum = AlbumStore::getInstance()->getAlbum(spAlbum, true); if (salbum){ while (!Session::getInstance()->lock()) ; while (!salbum->isLoaded()) { Session::getInstance()->processEvents(); } Session::getInstance()->unlock(); salbum->toggleStar(); AlbumStore::getInstance()->removeAlbum(salbum); } sp_album_release(spAlbum); } return true; }
bool Addon_music_spotify::GetContextButtons(CFileItemPtr& item, CContextButtons &buttons) { if (isReady()) { CURL url(item->GetPath()); CStdString uri = url.GetFileNameWithoutPath(); //the path will look something like this "musicdb://2/spotify:artist:0LcJLqbBmaGUft1e9Mm8HV/-1/" //if we are trying to show all tracks for a spotify artist, we cant use the params becouse they are only integers. if (uri.Left(13).Equals("spotify:album")) { uri = uri.Left(uri.Find('#')); sp_link *spLink = sp_link_create_from_string(uri); sp_album *spAlbum = sp_link_as_album(spLink); SxAlbum* salbum = AlbumStore::getInstance()->getAlbum(spAlbum, true); if (salbum) { buttons.Add( CONTEXT_BUTTON_SPOTIFY_TOGGLE_STAR_ALBUM, salbum->isStarred() ? Settings::getInstance()->getUnstarAlbumString() : Settings::getInstance()->getStarAlbumString()); AlbumStore::getInstance()->removeAlbum(salbum); buttons.Add(CONTEXT_BUTTON_SPOTIFY_BROWSE_ARTIST, Settings::getInstance()->getBrowseArtistString()); } sp_link_release(spLink); sp_album_release(spAlbum); } else if (uri.Left(13).Equals("spotify:track")) { uri = uri.Left(uri.Find('.')); Logger::printOut(uri); sp_link *spLink = sp_link_create_from_string(uri); sp_track* spTrack = sp_link_as_track(spLink); buttons.Add( CONTEXT_BUTTON_SPOTIFY_TOGGLE_STAR_TRACK, sp_track_is_starred(Session::getInstance()->getSpSession(), spTrack) ? Settings::getInstance()->getUnstarTrackString() : Settings::getInstance()->getStarTrackString()); buttons.Add(CONTEXT_BUTTON_SPOTIFY_BROWSE_ALBUM, Settings::getInstance()->getBrowseAlbumString()); buttons.Add(CONTEXT_BUTTON_SPOTIFY_BROWSE_ARTIST, Settings::getInstance()->getBrowseArtistString()); //this is unstable as it is now... find a solution later SxAlbum* salbum = AlbumStore::getInstance()->getAlbum( sp_track_album(spTrack), true); if (salbum) { while (!Session::getInstance()->lock()) ; while (!salbum->isLoaded()) { Session::getInstance()->processEvents(); } Session::getInstance()->unlock(); buttons.Add( CONTEXT_BUTTON_SPOTIFY_TOGGLE_STAR_ALBUM, salbum->isStarred() ? Settings::getInstance()->getUnstarAlbumString() : Settings::getInstance()->getStarAlbumString()); AlbumStore::getInstance()->removeAlbum(salbum); } sp_track_release(spTrack); sp_link_release(spLink); } } return true; }