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;

}
Exemplo n.º 3
0
  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;
}