static gpointer soundmenu_lastfm_scrobble_thread (gpointer userdata) { gint rv; LastfmData *data = userdata; SoundmenuPlugin *soundmenu = data->soundmenu; SoundmenuLastfm *lastfm = soundmenu->clastfm; rv = LASTFM_track_scrobble (lastfm->session_id, data->title, data->album ? data->album : "", data->artist, data->started_t, data->length, data->track_no, 0, NULL); if (rv != 0) g_critical("Last.fm submission failed"); soundmenu_lastfm_data_free (data); return NULL; }
bool cSession::ScrobbleOrUpdateTrack(const cMetaData& metaData, bool bScrobble) { std::cout<<"cSession::ScrobbleOrUpdateTrack "<<metaData.sArtist<<" - "<<metaData.sTitle<<std::endl; if (!IsLoggedIn()) { std::cerr<<"cSession::ScrobbleOrUpdateTrack Error not logged in to LastFM"<<std::endl; return false; } const std::string sArtistUTF8 = spitfire::string::ToUTF8(metaData.sArtist); const std::string sTitleUTF8 = spitfire::string::ToUTF8(metaData.sTitle); const std::string sAlbumUTF8 = spitfire::string::ToUTF8(metaData.sAlbum); char* szArtistUTF8 = new char[sArtistUTF8.length() + 1]; strcpy(szArtistUTF8, sArtistUTF8.c_str()); char* szTitleUTF8 = new char[sTitleUTF8.length() + 1]; strcpy(szTitleUTF8, sTitleUTF8.c_str()); char* szAlbumUTF8 = new char[sAlbumUTF8.length() + 1]; strcpy(szAlbumUTF8, sAlbumUTF8.c_str()); const uint64_t uiLengthSeconds = metaData.uiDurationMilliSeconds / 1000; int iResult = -1; if (bScrobble) { /*time_t rawtime; time(&rawtime); tm* ptm = gmtime(&rawtime); time_t started = mktime(ptm); if (ptm->tm_isdst) { ptm->tm_hour += 1; started = mktime(ptm); }*/ // TODO: Start a background thread so we don't have to do this time_t started; time(&started); started -= 31; // simulate playtime iResult = LASTFM_track_scrobble(pSession, szTitleUTF8, szAlbumUTF8, szArtistUTF8, started, uiLengthSeconds, 0, 0, nullptr); } else iResult = LASTFM_track_update_now_playing(pSession, szTitleUTF8, szAlbumUTF8, szArtistUTF8, uiLengthSeconds, 0, 0, nullptr); delete [] szAlbumUTF8; delete [] szTitleUTF8; delete [] szArtistUTF8; const char* szStatus = nullptr; const int* iErrorCode = nullptr; const char* szErrorText = nullptr; LASTFM_status(pSession, &szStatus, &iErrorCode, &szErrorText); std::cout<<"cSession::ScrobbleOrUpdateTrack returning "<<(iResult == 0)<<", status="<<szStatus<<", error="<<iErrorCode<<", "<<szErrorText<<std::endl; return (iResult == 0); }