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::getAllAlbums(CFileItemList& items, CStdString& artistStr) { Logger::printOut("get album"); if (isReady()) { if (artistStr.IsEmpty()) { //load all starred albums PlaylistStore* ps = Session::getInstance()->getPlaylistStore(); StarredList* sl = ps->getStarredList(); if (sl == NULL) return true; if (!sl->isLoaded()) return true; for (int i = 0; i < sl->getNumberOfAlbums(); i++) { SxAlbum* album = sl->getAlbum(i); //if its a multidisc we need to add them all int discNumber = album->getNumberOfDiscs(); if (discNumber == 1) items.Add(Utils::SxAlbumToItem(sl->getAlbum(i))); else { while (discNumber > 0) { items.Add(Utils::SxAlbumToItem(sl->getAlbum(i), "", discNumber)); discNumber--; } } } } else { //TODO do a small search for the artist and fetch the albums from the result } } return true; }
SxTrack::SxTrack(sp_track *spTrack) { // Logger::printOut("creating track"); // Logger::printOut(sp_track_name(spSxTrack)); while (!sp_track_is_loaded(spTrack)) ; //Logger::printOut("creating track loaded"); m_references = 1; m_spTrack = spTrack; m_name = sp_track_name(spTrack); m_rating = ceil((float)sp_track_popularity(spTrack) / 10); m_duration = 0.001 * sp_track_duration(spTrack); m_trackNumber = sp_track_index(spTrack); m_albumName = ""; m_albumArtistName = ""; m_year = 0; m_thumb = NULL; m_hasTHumb = false; //load the album and release it when we have harvested all data we need sp_album * album = sp_track_album(spTrack); if (sp_album_is_loaded(album)) { SxAlbum* sAlbum = AlbumStore::getInstance()->getAlbum(sp_track_album(spTrack), false); m_thumb = sAlbum->getThumb(); m_albumName = sAlbum->getAlbumName(); m_albumArtistName = sAlbum->getAlbumArtistName(); m_year = sAlbum->getAlbumYear(); //release it again AlbumStore::getInstance()->removeAlbum(sAlbum); if (m_thumb != NULL) { m_thumb->addRef(); m_hasTHumb = true; } } else Logger::printOut("no album loaded for track"); m_artistName = sp_artist_name(sp_track_artist(spTrack, 0)); sp_link *link = sp_link_create_from_track(spTrack, 0); m_uri = new char[256]; sp_link_as_string(link, m_uri, 256); sp_link_release(link); }
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::getAlbumTracks(CFileItemList& items, CStdString& path) { if (isReady()) { //lets split the string to get the album uri and the disc number CStdString uri = path.Left(path.Find('#')); CStdString discStr = path.Right(path.GetLength() - path.Find('#') - 1); //Logger::printOut(discStr.c_str()); int disc = atoi(discStr.c_str()); //0 means its not a multidisc, so we need to change it to 1 if (disc == 0) disc = 1; sp_link *spLink = sp_link_create_from_string(uri); sp_album *spAlbum = sp_link_as_album(spLink); SxAlbum* salbum = AlbumStore::getInstance()->getAlbum(spAlbum, true); vector<SxTrack*> tracks = salbum->getTracks(); for (int i = 0; i < tracks.size(); i++) { if (disc == tracks[i]->getDisc()) items.Add(Utils::SxTrackToItem(tracks[i])); } } 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; }