<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-562991290133196218</id><updated>2011-12-15T15:24:41.205+01:00</updated><category term='regex'/><category term='spotify'/><category term='MySQL'/><category term='google maps'/><category term='visual basic'/><category term='php'/><category term='distanceFrom'/><category term='apps'/><category term='distance'/><category term='windows'/><category term='api'/><category term='xbmc'/><category term='replace url with html'/><title type='text'>Amateurs' Exchange</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://amateurs-exchange.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/562991290133196218/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://amateurs-exchange.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Fredrik</name><uri>http://www.blogger.com/profile/07103132379457862456</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-562991290133196218.post-725954009082472509</id><published>2011-12-15T14:39:00.011+01:00</published><updated>2011-12-15T15:24:41.221+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='apps'/><category scheme='http://www.blogger.com/atom/ns#' term='spotify'/><title type='text'>Deciphering the Spotify Apps API</title><content type='html'>So, Spotify Apps has been launched and I presume a lot of developers are trying to figure out how to use the API that comes with it. &lt;a href="http://developer.spotify.com/download/spotify-apps-api/reference/"&gt;The documentation&lt;/a&gt; is kind of a light read and doesn't really tell us how to use the API or what methods we can access through it. I wrote a function that recursively iterates through the &lt;span style="font-weight:bold;"&gt;sp&lt;/span&gt; object and prints its properties and functions, in order to see what's actually there. This is the result:&lt;div&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="padding:0px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;object&lt;/span&gt; core&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;string&lt;/span&gt; country&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;undefined&lt;/span&gt; user&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;undefined&lt;/span&gt; product&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;undefined&lt;/span&gt; isApplicationFocused&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;boolean&lt;/span&gt; developer&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;undefined&lt;/span&gt; isDebugMode&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;object&lt;/span&gt; library&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:40px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;number&lt;/span&gt; totalPlaylists&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:40px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;number&lt;/span&gt; totalAlbums&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:40px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;number&lt;/span&gt; totalArtists&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:40px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;number&lt;/span&gt; totalTracks&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:40px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; removeEventListener() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:40px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; createPlaylistGroup() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:40px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; createPlaylist() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:40px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getPlaylists() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:40px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; removePlaylist() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:40px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getTracks() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:40px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getAlbums() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:40px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; setFilter() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:40px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; addPlaylist() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:40px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getArtists() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:40px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; addEventListener() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:40px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; movePlaylist() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;string&lt;/span&gt; language&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getAbTestGroup() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; logClientEvent() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getArguments() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; addEventListener() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; _set_body_size() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; activate() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getAuthToken() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getMetadata() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; internalCrash() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; removeEventListener() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getPlaylist() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getLastfmCredentials() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; browseUri() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getLoginMode() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; suggestSearch() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getAnonymousUserId() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; search() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; searchEx() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; parseHermesReply() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; setLastfmCredentials() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getHermes() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; registerSchema() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; readFile() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getStarredPlaylist() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getLinkType() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; spotifyUriToHttpLink() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; spotifyHttpLinkToUri() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getLinks() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; serializeToString() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; showClientMessage() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; showAuthDialog() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getTemporaryPlaylist() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; createUserLink() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;string&lt;/span&gt; uri&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:0px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;object&lt;/span&gt; desktop&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;undefined&lt;/span&gt; dropdown&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; showContextMenu() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:0px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;object&lt;/span&gt; social&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;undefined&lt;/span&gt; serviceStates&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;undefined&lt;/span&gt; relations&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; removeEventListener() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getUserByFacebookUid() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; showSharePopup() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getRecentFacebookUsers() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getUserByUsername() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; connectToFacebook() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; sendToInbox() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getFavorites() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getToplist() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; addEventListener() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; hideSharePopup() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:0px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;object&lt;/span&gt; trackPlayer&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; setContextCanSkipPrev() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; removeEventListener() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; setVolume() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; playTrackFromContext() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; canChangeRepeat() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; setShuffle() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; setContextCanShuffle() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; seek() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; skipToPreviousTrack() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getShuffle() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getPlayingContext() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getPlaybackControlState() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getNowPlayingTrack() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getVolume() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; setContextCanSkipNext() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; skipToNextTrack() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; playTrackFromUri() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; setContextCanRepeat() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getRepeat() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; canChangeShuffle() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getIsPlaying() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; setRepeat() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; setIsPlaying() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; addEventListener() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:0px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;object&lt;/span&gt; whatsnew&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; reportAdStarted() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getPartner() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; reportAdClicked() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; reportAdStopped() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; fetchAd() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:0px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;object&lt;/span&gt; installer&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; getApplicationState() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; removeEventListener() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; addEventListener() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; addApplicationFavorite() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; isApplicationFavorite() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="padding:20px;"&gt;&lt;span style="font-weight: bold; color: blue;"&gt;function&lt;/span&gt; removeApplicationFavorite() { &lt;span style="font-weight: bold; color: gray;"&gt;[native code]&lt;/span&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I haven't had the time to actually figure out what parameters to pass to each function, but I still find it kind of helpful. What I really want to know is what events I can bind listeners to, through addEventListener(), besides the "playerStateChanged" event, shown in &lt;a href="http://developer.spotify.com/download/spotify-apps-api/tutorial/"&gt;the example&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/562991290133196218-725954009082472509?l=amateurs-exchange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amateurs-exchange.blogspot.com/feeds/725954009082472509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://amateurs-exchange.blogspot.com/2011/12/decyfering-spotify-apps-api.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/562991290133196218/posts/default/725954009082472509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/562991290133196218/posts/default/725954009082472509'/><link rel='alternate' type='text/html' href='http://amateurs-exchange.blogspot.com/2011/12/decyfering-spotify-apps-api.html' title='Deciphering the Spotify Apps API'/><author><name>Fredrik</name><uri>http://www.blogger.com/profile/07103132379457862456</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-562991290133196218.post-361601791334404326</id><published>2010-10-05T10:24:00.010+02:00</published><updated>2010-10-05T12:01:10.416+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='distance'/><category scheme='http://www.blogger.com/atom/ns#' term='distanceFrom'/><category scheme='http://www.blogger.com/atom/ns#' term='google maps'/><title type='text'>Google Maps distanceFrom in MySQL</title><content type='html'>So, step two of &lt;a href="http://whatsupuppsala.se/"&gt;the website&lt;/a&gt; I was working on &lt;a href="http://amateurs-exchange.blogspot.com/2010/09/google-maps-api-v3-distancefrom-method.html"&gt;here&lt;/a&gt; was to actually search my MySQL database for points within a given distance of a second point. I simply converted the &lt;span style="font-style: italic;"&gt;Haversine formula &lt;/span&gt;to a MySQL query:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;SELECT &lt;/span&gt;*&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;FROM &lt;/span&gt;Point&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;WHERE&lt;/span&gt;&lt;br /&gt;6378137&lt;br /&gt;*&lt;br /&gt;(&lt;br /&gt;2&lt;br /&gt;*&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;ATAN2&lt;/span&gt;(&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;SQRT&lt;/span&gt;(&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;SIN&lt;/span&gt;((Point.Lat - &lt;span style="color: rgb(255, 0, 0);"&gt;59.332526&lt;/span&gt;) * &lt;span style="color: rgb(204, 51, 204);"&gt;PI&lt;/span&gt;() / 180)&lt;br /&gt;       *&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;SIN&lt;/span&gt;((Point.Lat - &lt;span style="color: rgb(255, 0, 0);"&gt;59.332526&lt;/span&gt;) * &lt;span style="color: rgb(204, 51, 204);"&gt;PI&lt;/span&gt;() / 180)&lt;br /&gt;       +&lt;br /&gt;   &lt;span style="color: rgb(204, 51, 204);"&gt;COS&lt;/span&gt;((&lt;span style="color: rgb(255, 0, 0);"&gt;59.332526&lt;/span&gt; * &lt;span style="color: rgb(204, 51, 204);"&gt;PI&lt;/span&gt;() / 180))&lt;br /&gt;       *&lt;br /&gt;   &lt;span style="color: rgb(204, 51, 204);"&gt;COS&lt;/span&gt;((Point.Lat * &lt;span style="color: rgb(204, 51, 204);"&gt;PI&lt;/span&gt;() / 180))&lt;br /&gt;       *&lt;br /&gt;   &lt;span style="color: rgb(204, 51, 204);"&gt;SIN&lt;/span&gt;(((Point.Lng - &lt;span style="color: rgb(255, 0, 0);"&gt;18.064091&lt;/span&gt;) * &lt;span style="color: rgb(204, 51, 204);"&gt;PI&lt;/span&gt;() / 180) / 2)&lt;br /&gt;       *&lt;br /&gt;   &lt;span style="color: rgb(204, 51, 204);"&gt;SIN&lt;/span&gt;(((Point.Lng - &lt;span style="color: rgb(255, 0, 0);"&gt;18.064091&lt;/span&gt;) * &lt;span style="color: rgb(204, 51, 204);"&gt;PI&lt;/span&gt;() / 180) / 2)&lt;br /&gt;),&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;SQRT&lt;/span&gt;(&lt;br /&gt;1&lt;br /&gt;   -&lt;br /&gt;(&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;SIN&lt;/span&gt;((Point.Lat - &lt;span style="color: rgb(255, 0, 0);"&gt;59.332526&lt;/span&gt;) * &lt;span style="color: rgb(204, 51, 204);"&gt;PI&lt;/span&gt;() / 180)&lt;br /&gt;       *&lt;br /&gt;   &lt;span style="color: rgb(204, 51, 204);"&gt;SIN&lt;/span&gt;((Point.Lat - &lt;span style="color: rgb(255, 0, 0);"&gt;59.332526&lt;/span&gt;) * &lt;span style="color: rgb(204, 51, 204);"&gt;PI&lt;/span&gt;() / 180)&lt;br /&gt;       +&lt;br /&gt;   &lt;span style="color: rgb(204, 51, 204);"&gt;COS&lt;/span&gt;((&lt;span style="color: rgb(255, 0, 0);"&gt;59.332526&lt;/span&gt; * &lt;span style="color: rgb(204, 51, 204);"&gt;PI&lt;/span&gt;() / 180))&lt;br /&gt;       *&lt;br /&gt;   &lt;span style="color: rgb(204, 51, 204);"&gt;COS&lt;/span&gt;((Point.Lat * &lt;span style="color: rgb(204, 51, 204);"&gt;PI&lt;/span&gt;() / 180))&lt;br /&gt;       *&lt;br /&gt;   &lt;span style="color: rgb(204, 51, 204);"&gt;SIN&lt;/span&gt;(((Point.Lng - &lt;span style="color: rgb(255, 0, 0);"&gt;18.064091&lt;/span&gt;) * &lt;span style="color: rgb(204, 51, 204);"&gt;PI&lt;/span&gt;() / 180) / 2)&lt;br /&gt;       *&lt;br /&gt;   &lt;span style="color: rgb(204, 51, 204);"&gt;SIN&lt;/span&gt;(((Point.Lng - &lt;span style="color: rgb(255, 0, 0);"&gt;18.064091&lt;/span&gt;) * &lt;span style="color: rgb(204, 51, 204);"&gt;PI&lt;/span&gt;() / 180) / 2)&lt;br /&gt;)&lt;br /&gt;)&lt;br /&gt;)&lt;br /&gt;) &lt;= 300 &lt;span style="color: rgb(0, 102, 0);"&gt;-- 300 meters&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;In the above example I use the LatLng position of central Stockholm (59.332526, 18.064091) as the base point and select all points within a 300-meter radius from it. Of course this can be simplified, but &lt;span style="font-weight:bold;"&gt;you get the Point&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/562991290133196218-361601791334404326?l=amateurs-exchange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amateurs-exchange.blogspot.com/feeds/361601791334404326/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://amateurs-exchange.blogspot.com/2010/10/google-maps-distancefrom-in-mysql.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/562991290133196218/posts/default/361601791334404326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/562991290133196218/posts/default/361601791334404326'/><link rel='alternate' type='text/html' href='http://amateurs-exchange.blogspot.com/2010/10/google-maps-distancefrom-in-mysql.html' title='Google Maps distanceFrom in MySQL'/><author><name>Fredrik</name><uri>http://www.blogger.com/profile/07103132379457862456</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-562991290133196218.post-5068460563048536715</id><published>2010-09-15T11:08:00.005+02:00</published><updated>2010-09-15T12:58:57.576+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='distanceFrom'/><category scheme='http://www.blogger.com/atom/ns#' term='google maps'/><title type='text'>Google Maps API V3 - distanceFrom method</title><content type='html'>I recently started upgrading a website, which uses Google Maps, from V2 to V3. On one page I needed to calculate the distance between two GLatLngs. This was easily done in V2 with the &lt;a href="http://code.google.com/apis/maps/documentation/javascript/v2/reference.html#GLatLng.distanceFrom"&gt;GLatLng.distanceFrom&lt;/a&gt; method. Although this method seems to have disappeared when V3 was released, so I created it:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;google.maps.LatLng.&lt;span style="color: rgb(0, 0, 153); font-weight: bold; font-style: italic;"&gt;prototype&lt;/span&gt;.distanceFrom = &lt;span style="color: rgb(0, 0, 153); font-weight: bold; font-style: italic;"&gt;function&lt;/span&gt;(p2) {&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 0, 153);"&gt;var &lt;/span&gt;R = 6378137; // earth's mean radius in meters (this was a parameter in V2)&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 0, 153); font-weight: bold;"&gt;var &lt;/span&gt;rad = function(x) {&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 0, 153);"&gt;return &lt;/span&gt;x&lt;span style="font-weight: bold;"&gt;*&lt;/span&gt;Math.PI/180;}&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold;"&gt;var &lt;/span&gt;dLat  = rad(p2.lat() - this.lat());&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 0, 153);"&gt;var &lt;/span&gt;dLong = rad(p2.lng() - this.lng());&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 0, 153);"&gt;var &lt;/span&gt;a = Math.sin(dLat/2) &lt;span style="font-weight: bold;"&gt;*&lt;/span&gt; Math.sin(dLat/2) &lt;span style="font-weight: bold;"&gt;+&lt;/span&gt; Math.cos(rad(this.lat())) &lt;span style="font-weight: bold;"&gt;*&lt;/span&gt; Math.cos(rad(p2.lat())) &lt;span style="font-weight: bold;"&gt;*&lt;/span&gt; Math.sin(dLong/2) &lt;span style="font-weight: bold;"&gt;*&lt;/span&gt; Math.sin(dLong/2);&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 0, 153);"&gt;var &lt;/span&gt;c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153); font-weight: bold; font-style: italic;"&gt;var &lt;/span&gt;d = R * c;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(0, 0, 153);"&gt;return &lt;/span&gt;d.toFixed(3);&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Using the &lt;span style="font-style: italic;"&gt;Haversine formula&lt;/span&gt; (&lt;a href="http://stackoverflow.com/questions/1502590/calculate-distance-between-two-points-in-google-maps-v3"&gt;found here&lt;/a&gt;) I created a custom method within the &lt;a href="http://code.google.com/apis/maps/documentation/javascript/reference.html#LatLng"&gt;LatLng class&lt;/a&gt;. I altered it a little in order to get the distance in meters instead of kilometres. Seems to work as intended!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/562991290133196218-5068460563048536715?l=amateurs-exchange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amateurs-exchange.blogspot.com/feeds/5068460563048536715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://amateurs-exchange.blogspot.com/2010/09/google-maps-api-v3-distancefrom-method.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/562991290133196218/posts/default/5068460563048536715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/562991290133196218/posts/default/5068460563048536715'/><link rel='alternate' type='text/html' href='http://amateurs-exchange.blogspot.com/2010/09/google-maps-api-v3-distancefrom-method.html' title='Google Maps API V3 - distanceFrom method'/><author><name>Fredrik</name><uri>http://www.blogger.com/profile/07103132379457862456</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-562991290133196218.post-5721486262407070610</id><published>2010-05-31T12:07:00.021+02:00</published><updated>2010-06-24T11:49:12.290+02:00</updated><title type='text'>EMAILProtect: Secure e-mail addresses in Wordpress</title><content type='html'>I wrote a plugin for Wordpress which secures e-mail addresses from being found by spam spiders (and other crawlers).&lt;br /&gt;&lt;br /&gt;The plugin rewrites e.g. "something@something.com" to a JavaScript. The script displays a clickable link for the user, but the original string is hidden from "non-JavaScript crawlers".&lt;br /&gt;&lt;br /&gt;Instead of updating the actual script here - and on other sites - will I only be using the Wordpress SVN.&lt;br /&gt;&lt;br /&gt;I will, however, be answering questions and taking suggestions through the comments.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Wordpress plugin site:&lt;br /&gt;&lt;/span&gt;&lt;a style="font-weight: bold;" href="http://wordpress.org/extend/plugins/emailprotect/"&gt;http://wordpress.org/extend/plugins/emailprotect/&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Fun fact #1: In less than one week on Wordpress, EMAILProtect was downloaded more than 1000 times.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/562991290133196218-5721486262407070610?l=amateurs-exchange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amateurs-exchange.blogspot.com/feeds/5721486262407070610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://amateurs-exchange.blogspot.com/2010/05/secure-e-mail-addresses-in-wordpress.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/562991290133196218/posts/default/5721486262407070610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/562991290133196218/posts/default/5721486262407070610'/><link rel='alternate' type='text/html' href='http://amateurs-exchange.blogspot.com/2010/05/secure-e-mail-addresses-in-wordpress.html' title='EMAILProtect: Secure e-mail addresses in Wordpress'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/16047848490506052268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-562991290133196218.post-4450908763214718982</id><published>2010-05-05T15:56:00.005+02:00</published><updated>2010-05-05T17:54:40.842+02:00</updated><title type='text'>Display hidden files in Finder</title><content type='html'>You may have been in the situation where you want to &lt;span style="font-weight: bold;"&gt;display hidden files in Finder&lt;/span&gt;. I've found that necessary when I want to edit system files e.g. ".htaccess" .&lt;br /&gt;&lt;br /&gt;There's a bunch of applications and script to do this but what I've noticed is that everyone of these are unnecessarily advanced.&lt;br /&gt;&lt;br /&gt;What I did is that I developed a _simple_ &lt;span style="font-weight: bold;"&gt;AppleScript application&lt;/span&gt; which you execute to display hidden files and when/if you want to hide them you just execute it again.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;set&lt;/span&gt; &lt;span style="color: rgb(51, 51, 153);"&gt;currentStatus&lt;/span&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;to&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;(do shell script "defaults read com.apple.Finder AppleShowAllFiles")&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;if&lt;/span&gt; &lt;span style="color: rgb(51, 51, 153);"&gt;currentStatus&lt;/span&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;is&lt;/span&gt; "&lt;span style="color: rgb(204, 0, 0);"&gt;YES&lt;/span&gt;" &lt;span style="color: rgb(0, 153, 0);"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;do&lt;/span&gt; &lt;span style="color: rgb(204, 51, 204);"&gt;shell &lt;span style="color: rgb(0, 0, 0);"&gt;script&lt;/span&gt;&lt;/span&gt; "&lt;span style="color: rgb(204, 0, 0);"&gt;defaults write com.apple.Finder AppleShowAllFiles NO&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;do&lt;/span&gt; &lt;span style="color: rgb(51, 51, 153);"&gt;&lt;span style="color: rgb(153, 51, 153);"&gt;shell&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;script&lt;/span&gt;&lt;/span&gt; "&lt;span style="color: rgb(204, 0, 0);"&gt;defaults write com.apple.Finder AppleShowAllFiles YES&lt;/span&gt;"&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;end if&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;do&lt;/span&gt; &lt;span style="color: rgb(51, 51, 153);"&gt;&lt;span style="color: rgb(153, 51, 153);"&gt;shell&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0);"&gt;script&lt;/span&gt;&lt;/span&gt; "&lt;span style="color: rgb(204, 0, 0);"&gt;KillAll Finder&lt;/span&gt;"&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.2shared.com/file/1X5RfJEX/HideShowFiles.html"&gt;Download file&lt;/a&gt;&lt;br /&gt;&lt;a href="http://uploading.com/files/dca92872/HideShowFiles.zip/"&gt;Mirror site #1&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.speedyshare.com/files/22283205/HideShowFiles.zip"&gt;Mirror site #2&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/562991290133196218-4450908763214718982?l=amateurs-exchange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amateurs-exchange.blogspot.com/feeds/4450908763214718982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://amateurs-exchange.blogspot.com/2010/05/display-hidden-files-in-finder.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/562991290133196218/posts/default/4450908763214718982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/562991290133196218/posts/default/4450908763214718982'/><link rel='alternate' type='text/html' href='http://amateurs-exchange.blogspot.com/2010/05/display-hidden-files-in-finder.html' title='Display hidden files in Finder'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/16047848490506052268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-562991290133196218.post-2528874572331116608</id><published>2009-11-11T10:29:00.014+01:00</published><updated>2010-09-25T02:41:51.023+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='regex'/><category scheme='http://www.blogger.com/atom/ns#' term='replace url with html'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Rewrite URL to HTML with PHP</title><content type='html'>When presenting an article or other information it's convenient for readers to be able to click on links you are referring to. With &lt;a href="http://en.wikipedia.org/wiki/Regular_expression"&gt;regular expressions&lt;/a&gt; the composers are able to write clickable links without know any HTML.&lt;br /&gt;&lt;br /&gt;In the example below we are getting the plain text in the variable &lt;strong&gt;$str&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Step one, which protocols are allowed? By adding more protocols to the array you're accepting them to be rewritten.&lt;br /&gt;&lt;code style="border: 1px solid rgb(238, 238, 238); padding: 10px; display: block; overflow-x: auto;"&gt;&lt;span style="color: rgb(0, 153, 0);" &gt;// Protocols&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;$protocols&lt;/span&gt; = array("http://", "https://", "ftp://");&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);" &gt;// Imploding the array to fit the regex&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;$protocols&lt;/span&gt; = str_replace("/", "\/", implode("|", &lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;$protocols&lt;/span&gt;));&lt;/code&gt;&lt;br /&gt;Step two, adding &lt;strong&gt;http://&lt;/strong&gt; to URLs without a specified protocol, like www.example.com&lt;br /&gt;&lt;code style="border: 1px solid rgb(238, 238, 238); padding: 10px; display: block;"&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;$str&lt;/span&gt; = preg_replace(&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span&gt;&lt;span&gt;"/(?&lt;=^|\(|\s)(www\.[A-Za-z0-9-_]+\.[A-Za-z\.]{2,6}(?:[\/\?].*)?)(?=[\.,!\?]*(?:\s|\(|\)|$))/U"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, "http://&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;$1&lt;/span&gt;", &lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;$str&lt;/span&gt;);&lt;/code&gt;&lt;br /&gt;Step three, replace all accepted URLs with HTML&lt;br /&gt;&lt;br /&gt;&lt;code style="border: 1px solid rgb(238, 238, 238); padding: 10px; display: block;"&gt;&lt;span style="color: rgb(0, 0, 102); font-weight: bold;"&gt;$str&lt;/span&gt; = preg_replace(&lt;span style="color: rgb(0, 0, 0);"&gt;"/(?&lt;=^|\(|\s)({&lt;span style="color: rgb(0, 0, 102); font-weight: bold;"&gt;$protocols&lt;/span&gt;})((?:[A-Za-z0-9-_]+\.)?[A-Za-z0-9_-]+\.[A-Za-z\.]{2,6}(?:[\/\?].*)?)(?=[\.,!\?]*(?:\s|\(|\)|$))/U"&lt;/span&gt;, "&amp;lt;a href=\"&lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;$1$2&lt;/span&gt;\"&gt;&lt;span style="color: rgb(0, 0, 102); font-weight: bold;"&gt;$2&lt;/span&gt;&amp;lt;/a&gt;", &lt;span style="font-weight: bold; color: rgb(0, 0, 102);"&gt;$str&lt;/span&gt;);&lt;/code&gt;&lt;br /&gt;This code will work with the following ways to write URLs:&lt;br /&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=562991290133196218&amp;amp;postID=2528874572331116608#"&gt;www.example.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=562991290133196218&amp;amp;postID=2528874572331116608#"&gt;http://www.example.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=562991290133196218&amp;amp;postID=2528874572331116608#"&gt;http://sub.example.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=562991290133196218&amp;amp;postID=2528874572331116608#"&gt;http://example.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=562991290133196218&amp;amp;postID=2528874572331116608#"&gt;www.example.com/example.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=562991290133196218&amp;amp;postID=2528874572331116608#"&gt;www.example.com/exempe/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=562991290133196218&amp;amp;postID=2528874572331116608#"&gt;www.example.com?id=1&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=562991290133196218&amp;amp;postID=2528874572331116608#"&gt;www.example.com/?id=1&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=562991290133196218&amp;amp;postID=2528874572331116608#"&gt;www.example.com?id=1#23&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=562991290133196218&amp;amp;postID=2528874572331116608#"&gt;www.example.com/example/#23&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(&lt;a href="http://www.blogger.com/post-edit.g?blogID=562991290133196218&amp;amp;postID=2528874572331116608#"&gt;http://example.com&lt;/a&gt;)&lt;br /&gt;(example: &lt;a href="http://www.blogger.com/post-edit.g?blogID=562991290133196218&amp;amp;postID=2528874572331116608#"&gt;www.example.com&lt;/a&gt;)&lt;br /&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=562991290133196218&amp;amp;postID=2528874572331116608#"&gt;www.example.com/example&lt;/a&gt;)&lt;br /&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=562991290133196218&amp;amp;postID=2528874572331116608#"&gt;www.example.com&lt;/a&gt;,&lt;br /&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=562991290133196218&amp;amp;postID=2528874572331116608#"&gt;www.example.com&lt;/a&gt;?&lt;br /&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=562991290133196218&amp;amp;postID=2528874572331116608#"&gt;www.example.com&lt;/a&gt;!&lt;br /&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=562991290133196218&amp;amp;postID=2528874572331116608#"&gt;http://example.com&lt;/a&gt;. - The dot won't be a part of the link&lt;br /&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=562991290133196218&amp;amp;postID=2528874572331116608#"&gt;http://example.com/&lt;/a&gt;. - The dot won't be a part of the link&lt;br /&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=562991290133196218&amp;amp;postID=2528874572331116608#"&gt;www.example.com?id=id=123.43&lt;/a&gt;. - The last dot won't be a part of the link&lt;br /&gt;&lt;br /&gt;But not with:&lt;br /&gt;example.com&lt;br /&gt;sub.example.com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/562991290133196218-2528874572331116608?l=amateurs-exchange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amateurs-exchange.blogspot.com/feeds/2528874572331116608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://amateurs-exchange.blogspot.com/2009/11/rewrite-url-to-html.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/562991290133196218/posts/default/2528874572331116608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/562991290133196218/posts/default/2528874572331116608'/><link rel='alternate' type='text/html' href='http://amateurs-exchange.blogspot.com/2009/11/rewrite-url-to-html.html' title='Rewrite URL to HTML with PHP'/><author><name>Jacob</name><uri>http://www.blogger.com/profile/16047848490506052268</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-562991290133196218.post-5704915090000593246</id><published>2009-11-10T21:25:00.002+01:00</published><updated>2009-11-10T22:30:21.612+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xbmc'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='visual basic'/><title type='text'>Automatic XBMC library update</title><content type='html'>Since I have my computer set up to automatically download TV shows I wanted my XBMC library to be automatically updated at all time. The "Update on startup" option was insufficient in my case since I rarely restart my computer. The media center is running on Windows XP which meant Python was not an option (since it can't fully interact with XBMC under Windows). So I created a small VB application that uses the XBMC HTTP API to update the library:&lt;br /&gt;&lt;code&gt;Call UpdateXBMCLibrary()&lt;br /&gt;&lt;br /&gt;Sub UpdateXBMCLibrary()&lt;br /&gt;WScript.Timeout = 120&lt;br /&gt;Dim objRequest&lt;br /&gt;Dim URL&lt;br /&gt;&lt;br /&gt;Set objRequest = CreateObject("Msxml2.ServerXMLHTTP")&lt;br /&gt;&lt;br /&gt;URL = "&lt;a class="linkification-ext" href="http://localhost:8080/xbmcCmds/xbmcHttp?command=ExecBuiltIn&amp;amp;parameter=XBMC.updatelibrary%28video" title="Linkification: http://localhost:8080/xbmcCmds/xbmcHttp?command=ExecBuiltIn&amp;amp;parameter=XBMC.updatelibrary(video"&gt;http://localhost:8080/xbmcCmds/xbmcHttp?command=ExecBuiltIn&amp;amp;parameter=XBMC.updatelibrary(video&lt;/a&gt;)"&lt;br /&gt;&lt;br /&gt;objRequest.open "GET", URL , false, "username", "password"&lt;br /&gt;objRequest.Send&lt;br /&gt;&lt;br /&gt;Set objRequest = Nothing&lt;br /&gt;End Sub&lt;/code&gt;&lt;br /&gt;I set up the web interface so that it runs on port 8080 with my desired username and password, used the Msxml2.ServerXMLHTTP object to make the HTTP request and voilà! It works.&lt;br /&gt;&lt;br /&gt;I added a scheduled task in order to make it update frequently. I guess you could modify the application so that it recognizes changes amongst the files but one update an hour works fine for me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/562991290133196218-5704915090000593246?l=amateurs-exchange.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amateurs-exchange.blogspot.com/feeds/5704915090000593246/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://amateurs-exchange.blogspot.com/2009/11/automatic-xbmc-library-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/562991290133196218/posts/default/5704915090000593246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/562991290133196218/posts/default/5704915090000593246'/><link rel='alternate' type='text/html' href='http://amateurs-exchange.blogspot.com/2009/11/automatic-xbmc-library-update.html' title='Automatic XBMC library update'/><author><name>Fredrik</name><uri>http://www.blogger.com/profile/07103132379457862456</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
