<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CEQERns6eyp7ImA9WxJVEEg.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823</id><updated>2009-06-26T14:38:27.513-07:00</updated><title type="text">YouTube API Blog</title><subtitle type="html">Your official source for information on the YouTube API.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://apiblog.youtube.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://apiblog.youtube.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>A Googler</name><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>65</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/YoutubeApiBlog" type="application/atom+xml" /><feedburner:emailServiceId>YoutubeApiBlog</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;AkcBRX86eip7ImA9WxJWE0k.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-970300242171560100</id><published>2009-06-18T11:00:00.000-07:00</published><updated>2009-06-18T11:00:54.112-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-18T11:00:54.112-07:00</app:edited><title>Simple Update Protocol for User Activity Feed docs are now available</title><content type="html">At Google I/O 2009, we demoed a nifty &lt;a href="http://code.google.com/p/gdata-samples/source/browse/#svn/trunk/uberviewer"&gt;sample application&lt;/a&gt; that tracks updates to any number of YouTube user activity feeds. The technology behind the application is the Simple Update Protocol (&lt;span class="il"&gt;SUP&lt;/span&gt;), a simple and compact "ping feed" that enables your application to efficiently monitor changes to a large number of user activity feeds.&lt;br /&gt;&lt;br /&gt;If you run a social network with tons of users who also happen to be active on YouTube, you should consider using &lt;span class="il"&gt;SUP&lt;/span&gt; to let your users easily share their updates on YouTube with their friends through their social graph on your site. See the docs &lt;a href="http://code.google.com/apis/youtube/2.0/developers_guide_protocol_sup.html"&gt;here&lt;/a&gt;&lt;u&gt;&lt;/u&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Posted by Kuan Yong, YouTube APIs and Tools Team&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-970300242171560100?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/oUiao6_eyjk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://apiblog.youtube.com/feeds/970300242171560100/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=2443724041307041823&amp;postID=970300242171560100" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/970300242171560100?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/970300242171560100?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/oUiao6_eyjk/simple-update-protocol-for-user.html" title="Simple Update Protocol for User Activity Feed docs are now available" /><author><name>Kuan Yong</name><uri>http://www.blogger.com/profile/16935301056658837962</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03469350828253255920" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://apiblog.youtube.com/2009/06/simple-update-protocol-for-user.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEGRH8_eCp7ImA9WxJXFUU.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-5329927040090421005</id><published>2009-06-09T16:03:00.001-07:00</published><updated>2009-06-09T16:03:45.140-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-09T16:03:45.140-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><title>Public Service Announcement - Upload Regression Testing</title><content type="html">The team has been working to improve the API upload infrastructure behind the scenes, and the new build is up at:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://uploads2.gdata.youtube.com/" target="_blank"&gt;http://uploads2.gdata.youtube.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Please do regression testing on your systems and report problems in our &lt;a title="discussion forum" href="http://groups.google.com/group/youtube-api-gdata" id="y1vj"&gt;discussion forum&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Barring any major complications, this will begin rolling out to the production uploads URL (uploads.gdata.youtube.com) in two weeks.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Posted by Stephanie Liu, YouTube APIs and Tools Team&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-5329927040090421005?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/NZLCll6Iop4" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/5329927040090421005?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/5329927040090421005?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/NZLCll6Iop4/public-service-announcement-upload.html" title="Public Service Announcement - Upload Regression Testing" /><author><name>Stephanie Liu</name><uri>http://www.blogger.com/profile/08457117592361473057</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="06938078375332321706" /></author><feedburner:origLink>http://apiblog.youtube.com/2009/06/public-service-announcement-upload.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ENQX05fip7ImA9WxJQFE0.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-976502736995045215</id><published>2009-05-26T23:26:00.000-07:00</published><updated>2009-05-26T23:28:10.326-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-26T23:28:10.326-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><title>Google I/O Pass Winner!</title><content type="html">Wow, there's quite a bit of creative talent out there! It was hard to select from &lt;a title="all the posts" href="http://groups.google.com/group/youtube-api-gdata/browse_thread/thread/8dff8bdc11e91795" id="loiu"&gt;all the posts&lt;/a&gt;, but the winning haiku was from &lt;span style="font-weight: bold;"&gt;lionstone&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;public void youtube&lt;br /&gt; extends the community&lt;br /&gt; return social change&lt;br /&gt;&lt;br /&gt;Honorable mention goes to Ron (who already bought a ticket to the conference!):&lt;br /&gt;&lt;br /&gt;Documentation -&lt;br /&gt; cut, five, seven, five, season&lt;br /&gt; form situation&lt;br /&gt;&lt;br /&gt;We'll be seeing both of them at &lt;a title="Google I/O" href="http://code.google.com/events/io/" id="q1ag"&gt;Google I/O&lt;/a&gt; tomorrow -- if you're coming as well, come say 'hi' to the team at Office Hours, at the Sandbox, and in our two sessions. If you can't make it, watch the &lt;a title="Twitter stream" href="http://googleio.twazzup.com/" id="yakb"&gt;Twitter stream&lt;/a&gt; during the conference and the &lt;a title="videos" href="http://www.youtube.com/googledevelopers" id="i4v:"&gt;videos&lt;/a&gt; that will be posted afterwards.&lt;br /&gt;&lt;br /&gt;Posted by Stephanie Liu, YouTube APIs and Tools Team&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-976502736995045215?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/nFDVP_OKSWU" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/976502736995045215?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/976502736995045215?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/nFDVP_OKSWU/google-io-pass-winner.html" title="Google I/O Pass Winner!" /><author><name>Stephanie Liu</name><uri>http://www.blogger.com/profile/08457117592361473057</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="06938078375332321706" /></author><feedburner:origLink>http://apiblog.youtube.com/2009/05/google-io-pass-winner.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkABRHYzfCp7ImA9WxJRFkQ.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-1742831488870806016</id><published>2009-05-18T17:50:00.000-07:00</published><updated>2009-05-18T17:59:15.884-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-18T17:59:15.884-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><title>Google I/O Pass</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6NxOo7yjlR4/ShIC4-1Rq7I/AAAAAAAAADw/o8Lg7-Jhimo/s1600-h/color_io_badge.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 67px; border:none; " src="http://1.bp.blogspot.com/_6NxOo7yjlR4/ShIC4-1Rq7I/AAAAAAAAADw/o8Lg7-Jhimo/s200/color_io_badge.jpg" alt="" id="BLOGGER_PHOTO_ID_5337331686349843378" border="0" /&gt;&lt;/a&gt;&lt;a href="http://code.google.com/events/io/" id="e4j8" title="Google I/O"&gt;Google I/O&lt;/a&gt;, our largest developer conference in San Francisco, CA, is just around the corner, and we'd love to see more YouTube developers there. We'll have two formal sessions, as well as office hours and lots of demos at the Developer Sandbox.&lt;br /&gt;&lt;br /&gt;Kuan, our Product Manager, will be giving a session about &lt;a href="http://code.google.com/events/io/sessions/BestPracticesYouTubeApps.html" id="c2_t" title="writing great, monetizable apps"&gt;writing great, monetizable apps&lt;/a&gt;, and Jeff Fisher and Jochen Hartmann will be giving a session on the &lt;a href="http://code.google.com/events/io/sessions/GoingSocialYouTubeApps.html" id="xm6x" title="new social feeds"&gt;new social feeds&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Check out the rest of the &lt;a href="http://code.google.com/events/io/sessions.html" id="guyi" title="great sessions"&gt;great sessions&lt;/a&gt; and the &lt;a href="http://code.google.com/events/io/schedule.html" id="ymu6" title="schedule"&gt;schedule&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We have one free pass ($400 value) to give away, so if you'll be in the area, tell us why you want to go in &lt;a title="this forum thread" href="http://groups.google.com/group/youtube-api-gdata/browse_thread/thread/8dff8bdc11e91795" id="u:nk"&gt;this forum thread&lt;/a&gt;. We'll pick the worthiest person by the end of the week (hint: Jeff really likes Haikus :).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Posted by Stephanie Liu, YouTube APIs and Tools Team&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-1742831488870806016?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/qyMi8kGArP0" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/1742831488870806016?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/1742831488870806016?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/qyMi8kGArP0/google-io-pass.html" title="Google I/O Pass" /><author><name>Stephanie Liu</name><uri>http://www.blogger.com/profile/08457117592361473057</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="06938078375332321706" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_6NxOo7yjlR4/ShIC4-1Rq7I/AAAAAAAAADw/o8Lg7-Jhimo/s72-c/color_io_badge.jpg" height="72" width="72" /><feedburner:origLink>http://apiblog.youtube.com/2009/05/google-io-pass.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8NSX86eCp7ImA9WxJSFUs.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-5166217240890518568</id><published>2009-05-05T16:05:00.000-07:00</published><updated>2009-05-05T16:08:18.110-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-05T16:08:18.110-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="video" /><title>YouTube APIs: Search Explained</title><content type="html">In an alternate universe (where I have a goatee) I may be a voice actor instead of a Googler. However, since we live in this universe, the best I can do is make you a screencast about the YouTube API. Specifically, this video discusses the various search options we have in our Data API and the various limitations and caveats to keep in mind while integrating it into your program or website.&lt;br /&gt;&lt;br /&gt;If our API documentation is like the printed manual in the box of a new purchase that you never read, think of this video as the one-page laminated card with pretty pictures on it telling you not to get crushed by a bookshelf or hurt your back. Enjoy!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/sOEAD-gfJ_M&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/sOEAD-gfJ_M&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-5166217240890518568?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/yaWkCzEIVl0" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/5166217240890518568?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/5166217240890518568?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/yaWkCzEIVl0/youtube-apis-search-explained.html" title="YouTube APIs: Search Explained" /><author><name>Jeff Fisher</name><email>noreply@blogger.com</email></author><feedburner:origLink>http://apiblog.youtube.com/2009/05/youtube-apis-search-explained.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QERn8zeCp7ImA9WxJTE0k.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-6162815977682324482</id><published>2009-04-21T11:11:00.000-07:00</published><updated>2009-04-21T13:21:47.180-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-21T13:21:47.180-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tutorials" /><category scheme="http://www.blogger.com/atom/ns#" term="code" /><category scheme="http://www.blogger.com/atom/ns#" term="json" /><category scheme="http://www.blogger.com/atom/ns#" term="devs" /><category scheme="http://www.blogger.com/atom/ns#" term="appengine" /><title>Modifying Chow-Down Part 2: Make it Faster!</title><content type="html">As promised in the &lt;a href="http://apiblog.youtube.com/2009/04/modifying-chow-down-application-part-1.html"&gt;previous blog post&lt;/a&gt;, I was given the task of making our &lt;a href="http://chow-down-gdata.appspot.com/"&gt;Chow Down Gdata&lt;/a&gt; sample a little faster. It would sometimes take a while to load restaurant information due to the requests to YouTube and Picasa Web Albums taking a while to be processed on the backend. Since this would cause the user to sometimes see a "loading" bar for several seconds; something had to be done.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3bO2g9UbC5k/Se4qkjKaV9I/AAAAAAAAABo/wdMMA2e870E/s1600-h/chow-down-gdata.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 196px;" src="http://1.bp.blogspot.com/_3bO2g9UbC5k/Se4qkjKaV9I/AAAAAAAAABo/wdMMA2e870E/s320/chow-down-gdata.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5327242216628443090" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Originally, the application used the Python client library to retrieve information from YouTube and PWA and then stored it inside of memcache. The new solution is to instead retrieves these feeds directly in the browser using the &lt;a href="http://code.google.com/apis/gdata/json.html"&gt;json-in-script support&lt;/a&gt; of the Google Data APIs. This approach worked well for the Chow Down application since we were not retrieving any private information for use in this application and so did not need to authenticate as a user.&lt;br /&gt;&lt;br /&gt;Another benefit of using the JSON feeds is that the browser can asynchronously request results from both YouTube and PWA at the same time and render the results as soon as they are returned. This helps decrease the "perceived load time" that the user experiences since they are seeing information start to be loaded instead of just watching a progress bar.&lt;br /&gt;&lt;br /&gt;The code for the entire sample is available on code.google.com:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/gdata-samples/source/browse/trunk/chow-down-gdata/"&gt;http://code.google.com/p/gdata-samples/source/browse/trunk/chow-down-gdata/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But you can see all of the logic for retrieving the feeds using JavaScript in the ajax_restaurant_info template:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/gdata-samples/source/browse/trunk/chow-down-gdata/src/templates/ajax_restaurant_info.html"&gt;http://code.google.com/p/gdata-samples/source/browse/trunk/chow-down-gdata/src/templates/ajax_restaurant_info.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The code makes use of the &lt;a href="http://jquery.com/"&gt;jQuery JavaScript library&lt;/a&gt; in order to remain compact and compatible.&lt;br /&gt;&lt;br /&gt;So if your site is using the Data APIs of one or more Google properties and you don't need authentication, considering switching to the JSON feeds to improve perceived latency and let your pages load the AJAXy way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-6162815977682324482?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/-fimD4dTkys" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/6162815977682324482?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/6162815977682324482?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/-fimD4dTkys/modifying-chow-down-part-2-make-it.html" title="Modifying Chow-Down Part 2: Make it Faster!" /><author><name>Jeff Fisher</name><email>noreply@blogger.com</email></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_3bO2g9UbC5k/Se4qkjKaV9I/AAAAAAAAABo/wdMMA2e870E/s72-c/chow-down-gdata.png" height="72" width="72" /><feedburner:origLink>http://apiblog.youtube.com/2009/04/modifying-chow-down-part-2-make-it.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcMQnk-fip7ImA9WxVaGU8.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-6672572241533824787</id><published>2009-04-16T16:09:00.000-07:00</published><updated>2009-04-16T17:11:23.756-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-16T17:11:23.756-07:00</app:edited><title>Modifying the Chow-Down Application, part 1: Adding media from YouTube and Picasa</title><content type="html">Recently I was given the task of modifying the &lt;a href="http://chow-down.appspot.com/" target="_blank"&gt;Chow Down&lt;/a&gt; sample application (originally written to demonstrate how to implement the &lt;a href="http://code.google.com/apis/friendconnect/" target="_blank"&gt;Google FriendConnect API&lt;/a&gt; on &lt;a href="http://code.google.com/appengine/" target="_blank"&gt;Google AppEngine&lt;/a&gt;) to include videos, pictures and search results in the restaurant detail pages. This task resulted in the creation of &lt;a href="http://chow-down-gdata.appspot.com/" target="_blank"&gt;Chow Down Gdata&lt;/a&gt; (&lt;a href="http://code.google.com/p/gdata-samples/source/browse/branches/chow-down-gdata/1.0/src/" target="_blank"&gt;full source code&lt;/a&gt;) which uses the &lt;a href="http://code.google.com/apis/youtube/2.0/developers_guide_protocol_audience.html" target="_blank"&gt;YouTube Data API&lt;/a&gt;, the &lt;a href="http://code.google.com/apis/picasaweb/overview.html" target="_blank"&gt;Picasa Web Albums API&lt;/a&gt; and the &lt;a href="http://code.google.com/apis/ajaxsearch/" target="_blank"&gt;AJAX Search APIs&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_B8HA18T3qlI/See_GYMJK5I/AAAAAAAAABM/kqehVmvmhsI/s1600-h/chowndown_gdata.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer; width: 320px; height: 270px;" src="http://4.bp.blogspot.com/_B8HA18T3qlI/See_GYMJK5I/AAAAAAAAABM/kqehVmvmhsI/s320/chowndown_gdata.png" alt="" id="BLOGGER_PHOTO_ID_5325435200682404754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;Since everything was written in Python, using our &lt;a href="http://code.google.com/apis/gdata/articles/python_client_lib.html" target="_blank"&gt;Python client library&lt;/a&gt; was a no brainer. The first step was to add the necessary files and import statements. The application follows a standard &lt;a href="http://en.wikipedia.org/wiki/Model-view-controller" target="_blank"&gt;MVC&lt;/a&gt; layout, so the next step was to create a new view called &lt;code&gt;JsonRestaurantInfoView&lt;/code&gt; in &lt;a href="http://code.google.com/p/gdata-samples/source/browse/branches/chow-down-gdata/1.0/src/views.py" target="_blank"&gt;&lt;code&gt;views.py&lt;/code&gt;&lt;/a&gt;, which I then connected both to the &lt;a href="http://code.google.com/p/gdata-samples/source/browse/branches/chow-down-gdata/1.0/src/templates/ajax_restaurant_info.html" target="_blank"&gt;&lt;code&gt;ajax_restaurant_info.html&lt;/code&gt;&lt;/a&gt;template and also to the &lt;code&gt;restaurants_info&lt;/code&gt; method in &lt;a href="http://code.google.com/p/gdata-samples/source/browse/branches/chow-down-gdata/1.0/src/providers/restaurants.py" target="_blank"&gt;&lt;code&gt;providers/restaurants.py&lt;/code&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The bulk of the modifications happen inside &lt;code&gt;restaurants_info&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# Create client and query to execute a YouTube search:&lt;br /&gt;gdata_youtube_client = gdata.youtube.service.YouTubeService();&lt;br /&gt;query = gdata.youtube.service.YouTubeVideoQuery()&lt;br /&gt;query.vq = "%s %s" % (restaurant.name, restaurant.city)&lt;br /&gt;video_feed = gdata_youtube_client.YouTubeQuery(query)&lt;br /&gt;&lt;br /&gt;# Grab the URL to the embeddable Flash player SWF (if embeddable)&lt;br /&gt;swf_url = video_entry.GetSwfUrl()&lt;br /&gt;&lt;br /&gt;if swf_url:&lt;br /&gt; restaurant.player = """&amp;lt;object width="425" height="350"&amp;gt;&lt;br /&gt;        &amp;lt;param name="movie" value="%s"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;        &amp;lt;embed src="%s" type="application/x-shockwave-flash"&lt;br /&gt;         width="425" height="350"&amp;gt;&amp;lt;/embed&amp;gt;&amp;lt;/object&amp;gt;""" %&lt;br /&gt;         (swf_url, swf_url)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;But wait! We are not done yet. Let's also look for pictures for this restaurant in Picasa:&lt;br /&gt;&lt;pre&gt;gdata_picasawebalbums_client = gdata.photos.service.PhotosService()&lt;br /&gt;query_parameters = map(urllib.quote, [restaurant.name, restaurant.city]);&lt;br /&gt;&lt;br /&gt;# Fetch a feed of 10 thumbnails, 32x32 pixels in size and cropped to a square&lt;br /&gt;photo_feed = gdata_picasawebalbums_client.GetFeed(&lt;br /&gt; "/data/feed/api/all?q=%s%%20%s&amp;amp;max-results=10&amp;amp;thumbsize=32c" %&lt;br /&gt; (query_parameters[0], query_parameters[1]))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;We store all the new metadata in the restaurant object that ends up being passed to the template. To direct users there from the search page, I added a simple &lt;a href="http://code.google.com/p/gdata-samples/source/browse/branches/chow-down-gdata/1.0/src/templates/index.html#49" target="_blank"&gt;&lt;code&gt;show_restaurant_info&lt;/code&gt;&lt;/a&gt; function which is triggered when a user clicks on the restaurant title in the search listing. While I was in the templates/index.html file, I also added the &lt;a href="http://code.google.com/p/gdata-samples/source/browse/branches/chow-down-gdata/1.0/src/templates/index.html#63" target="_blank"&gt;&lt;code&gt;ajax_api_restaurant_info&lt;/code&gt;&lt;/a&gt; function which fetches blog, web, news and book search information about the restaurant.&lt;br /&gt;&lt;br /&gt;Check out the &lt;a href="http://code.google.com/p/gdata-samples/source/browse/branches/chow-down-gdata/#chow-down-gdata/1.0" target="_blank"&gt;full source code&lt;/a&gt; to get the full picture including information about how this data was also cached.&lt;br /&gt;&lt;br /&gt;In the next article, Jeff Fisher is going to talk about how to optimize the performance for this application by using JavaScript.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-6672572241533824787?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/ED_WR_efjl0" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/6672572241533824787?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/6672572241533824787?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/ED_WR_efjl0/modifying-chow-down-application-part-1.html" title="Modifying the Chow-Down Application, part 1: Adding media from YouTube and Picasa" /><author><name>Jochen Hartmann</name><email>noreply@blogger.com</email></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_B8HA18T3qlI/See_GYMJK5I/AAAAAAAAABM/kqehVmvmhsI/s72-c/chowndown_gdata.png" height="72" width="72" /><feedburner:origLink>http://apiblog.youtube.com/2009/04/modifying-chow-down-application-part-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4ASXg4fCp7ImA9WxVaEU8.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-998054480324807047</id><published>2009-04-07T10:51:00.000-07:00</published><updated>2009-04-07T10:55:48.634-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-07T10:55:48.634-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><title>Latest Release Notes: Playlist Search, Time, and More</title><content type="html">Enjoy a few new tidbits in the latest release.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Search for playlists&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Yup, the same way you can &lt;a href="http://code.google.com/apis/youtube/2.0/reference.html#Videos_feed" id="nvd-" title="search for videos"&gt;search for videos&lt;/a&gt; and &lt;a href="http://code.google.com/apis/youtube/2.0/developers_guide_protocol_channel_search.html" id="miqf" title="channels"&gt;channels&lt;/a&gt; , you can now use the API to &lt;a title="search for playlists" href="http://code.google.com/apis/youtube/2.0/developers_guide_protocol.html#Searching_for_Playlists" id="qye1"&gt;search for playlists&lt;/a&gt;:&lt;br /&gt;&lt;pre style="font-family: courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;a title="http://gdata.youtube.com/feeds/api/playlists/snippets?q=soccer&amp;amp;v=2" href="http://gdata.youtube.com/feeds/api/playlists/snippets?q=soccer&amp;amp;v=2" id="dscz"&gt;http://gdata.youtube.com/feeds/api/playlists/snippets?q=soccer&amp;amp;v=2&lt;/a&gt;&lt;/span&gt;&lt;/pre&gt; The query above will return a list of playlist snippets that match the query 'soccer'. Searching in playlists is an excellent way to find YouTube videos about a specific point of interest (e.g. dancing, cooking, sports etc.).&lt;br /&gt;&lt;h4&gt;Time filtering for video search&lt;br /&gt;&lt;/h4&gt;You can now restrict the video search result to a specific time interval (today, this_week,  this_month, all_time):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;a title="http://gdata.youtube.com/feeds/api/videos?q=soccer&amp;amp;time=today&amp;amp;v=2" href="http://gdata.youtube.com/feeds/api/videos?q=soccer&amp;amp;time=today&amp;amp;v=2" id="zvqc"&gt;http://gdata.youtube.com/feeds/api/videos?q=soccer&amp;amp;time=today&amp;amp;v=2&lt;/a&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The default is 'all_time'.&lt;br /&gt;&lt;h4&gt;More results&lt;/h4&gt;You can now request past the 100th video in a playlist and past the 200th video in a favorite list. Additionally, you can now get 1000 videos in a search feed instead of 999! Enjoy that last video, guys.&lt;br /&gt;&lt;br /&gt;As always, &lt;a title="post in the forum" href="http://groups.google.com/group/youtube-api-gdata" id="bn9g"&gt;post in the forum&lt;/a&gt;  if you have any feedback or questions!&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Posted by Daniel Danciu, Software Engineer&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-998054480324807047?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/E2JDwgN1TCk" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/998054480324807047?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/998054480324807047?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/E2JDwgN1TCk/latest-release-notes-playlist-search.html" title="Latest Release Notes: Playlist Search, Time, and More" /><author><name>Stephanie Liu</name><uri>http://www.blogger.com/profile/08457117592361473057</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="06938078375332321706" /></author><feedburner:origLink>http://apiblog.youtube.com/2009/04/latest-release-notes-playlist-search.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYGSXo5fip7ImA9WxVUE0w.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-2459565196499145564</id><published>2009-03-17T11:29:00.000-07:00</published><updated>2009-03-17T12:12:08.426-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-17T12:12:08.426-07:00</app:edited><title>Recent activity: apitestjhartmann has written a tutorial</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_B8HA18T3qlI/Sb_s-MCjJvI/AAAAAAAAAAk/-deBQtnwah0/s1600-h/activityApp3.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 289px;" src="http://1.bp.blogspot.com/_B8HA18T3qlI/Sb_s-MCjJvI/AAAAAAAAAAk/-deBQtnwah0/s320/activityApp3.png" alt="" id="BLOGGER_PHOTO_ID_5314226638448436978" border="0" /&gt;&lt;/a&gt;As you may have heard, &lt;a href="http://apiblog.youtube.com/2009/02/youtube-api-outgrows-shy-adolescence.html" target="_blank"&gt;YouTube has been getting more social lately&lt;/a&gt;. Our activity feeds help your users stay up-to-date on the cool channels and videos that their friends (or anyone else, for that matter) have been uploading, subscribing to, adding as favorites and so forth.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;But we don't just care about YouTube users. We also care about developers. And we want you to have time to be more social, too.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;With that in mind, Jeff Fisher and I wrote a &lt;a href="http://code.google.com/apis/youtube/articles/youtube_api_activity_php.html" target="_blank"&gt;hands-on tutorial&lt;/a&gt; that explains how to build the &lt;a href="http://www.googlecodesamples.com/youtube/php/YouTubeActivityViewer/" target="_blank"&gt;YouTubeActivityViewer&lt;/a&gt;, a PHP application that uses the new activity feeds. The application uses our &lt;a href="http://code.google.com/apis/youtube/developers_guide_php.html" target="_blank"&gt;PHP client library&lt;/a&gt; with &lt;a href="http://jquery.com/" target="_blank"&gt;jQuery&lt;/a&gt;. If you're still not ready to rush out and socialize, you can also build in a caching system with &lt;a href="http://www.danga.com/memcached/" target="_blank"&gt;memcache&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-2459565196499145564?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/XU4WN-s68Mo" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/2459565196499145564?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/2459565196499145564?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/XU4WN-s68Mo/recent-activity-apitestjhartmann-has.html" title="Recent activity: apitestjhartmann has written a tutorial" /><author><name>Jochen Hartmann</name><email>noreply@blogger.com</email></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_B8HA18T3qlI/Sb_s-MCjJvI/AAAAAAAAAAk/-deBQtnwah0/s72-c/activityApp3.png" height="72" width="72" /><feedburner:origLink>http://apiblog.youtube.com/2009/03/recent-activity-apitestjhartmann-has.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMBRH44cCp7ImA9WxVVEkU.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-7162165252735754783</id><published>2009-03-05T11:58:00.000-08:00</published><updated>2009-03-05T12:04:15.038-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-05T12:04:15.038-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="samples" /><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><category scheme="http://www.blogger.com/atom/ns#" term="releases" /><category scheme="http://www.blogger.com/atom/ns#" term="dotnet" /><title>Latest .NET SDK Released! LINQ &amp; New Social Notifier Sample</title><content type="html">&lt;div&gt;  &lt;i&gt;Posted by Frank Mantek, Google Data APIs Team&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt;  The new .NET SDK is released and available for download here:&lt;br /&gt;&lt;br /&gt; &lt;a href="http://code.google.com/p/google-gdata/downloads/list" target="_blank"&gt;http://code.google.com/p/&lt;wbr&gt;google-gdata/downloads/list&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There's now updated support for YouTube V2 and a new vertical object model that allows you to use local LINQ queries. Please go through the &lt;a title="Google.YouTube" href="http://google-gdata.googlecode.com/svn/docs/folder55/N_Google_YouTube.htm" id="zusz"&gt;Google.YouTube&lt;/a&gt;  namespaces and see what's new there. We have some documentation for it here:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://google-gdata.googlecode.com/svn/trunk/clients/cs/docs/AdditionalContent/YouTubeLinqExamples.html" target="_blank"&gt;http://google-gdata.&lt;wbr&gt;googlecode.com/svn/trunk/&lt;wbr&gt;clients/cs/docs/&lt;wbr&gt;AdditionalContent/&lt;wbr&gt;YouTubeLinqExamples.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Last, but not least, there is the &lt;a href="http://code.google.com/p/google-gdata/source/browse/#svn/trunk/clients/cs/samples/YouTubeNotifier"&gt;Notifier for YouTube&lt;/a&gt; sample application, which showcases the &lt;a href="http://apiblog.youtube.com/2009/02/youtube-api-outgrows-shy-adolescence.html"&gt;activity feeds&lt;/a&gt; YouTube is exposing. You can subscribe to events from your friends and other YouTube users and get notified whenever they leave their marks in the YouTube universe. The &lt;a title="sample" href="http://google-gdata.googlecode.com/files/nfyt.exe" id="b64:"&gt;sample&lt;/a&gt;  is also available as a separate download.&lt;br /&gt;&lt;br /&gt;The complete release notes can be found here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://google-gdata.googlecode.com/svn/docs/RELEASE_NOTES.HTML" target="_blank"&gt;http://google-gdata.&lt;wbr&gt;googlecode.com/svn/docs/&lt;wbr&gt;RELEASE_NOTES.HTML&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;which also lists all the bugs that were fixed in this release. Report new ones here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/google-gdata/issues/list" target="_blank"&gt;http://code.google.com/p/&lt;wbr&gt;google-gdata/issues/list&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-7162165252735754783?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/pEtGNuM3inw" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/7162165252735754783?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/7162165252735754783?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/pEtGNuM3inw/latest-net-sdk-released-linq-new-social.html" title="Latest .NET SDK Released! LINQ &amp; New Social Notifier Sample" /><author><name>Stephanie Liu</name><uri>http://www.blogger.com/profile/08457117592361473057</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="06938078375332321706" /></author><feedburner:origLink>http://apiblog.youtube.com/2009/03/latest-net-sdk-released-linq-new-social.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQMSHo_cCp7ImA9WxVVEE4.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-6545573234468869982</id><published>2009-03-02T13:58:00.000-08:00</published><updated>2009-03-02T14:19:49.448-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-02T14:19:49.448-08:00</app:edited><title>PHP Client Library: Uploading videos now 99% more efficient !</title><content type="html">&lt;span style="font-style: italic;"&gt;Posted by Jochen Hartmann, YouTube APIs and Tools Team&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_B8HA18T3qlI/SaxaQm_coMI/AAAAAAAAAAc/lV-8vq5q_LM/s1600-h/99percent_final.jpg"&gt;&lt;img style="display:block; margin:0px; cursor:pointer; cursor:hand;width: 200px; height: 200px; border: none;" src="http://1.bp.blogspot.com/_B8HA18T3qlI/SaxaQm_coMI/AAAAAAAAAAc/lV-8vq5q_LM/s200/99percent_final.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5308717302154043586" /&gt;&lt;/a&gt;&lt;br /&gt;If you are using the &lt;a href="http://framework.zend.com/download/gdata"&gt;PHP Client Library&lt;/a&gt; to upload your videos to YouTube.com you may have had to deal with memory issues, such as the common &lt;span style="color: rgb(0, 0, 0);font-family:courier new;" &gt;Fatal error: Allowed memory size of ... bytes exhausted&lt;/span&gt; error message.&lt;br /&gt;&lt;br /&gt;I am happy to announce that &lt;a href="http://framework.zend.com/download/latest"&gt;as of version 1.7.6 of the client library&lt;/a&gt;, this should no longer be a problem. Jeff Fisher and I have added support for streaming large video files to our API in manageable 1 MB chunks. The change is completely transparent, so you won't need to do anything besides upgrade your copy of the client library.&lt;br /&gt;&lt;br /&gt;Prior to this change, our client library used to rely solely on the &lt;a href="http://framework.zend.com/apidoc/core/Zend_Http/Client/Zend_Http_Client.html"&gt;Zend_Http_Client&lt;/a&gt; object to handle HTTP communication between servers. The client makes requests by reading the entire body of your &lt;a href="http://en.wikipedia.org/wiki/Http"&gt;HTTP POST&lt;/a&gt; message into a string, which then gets sent to our API server. This behavior is perfectly acceptable for normal use since most of the time we are just sending XML strings or small media files such as images, but doesn't work quite so well for uploading 1 GB video files.&lt;br /&gt;&lt;br /&gt;To address this problem, I designed a &lt;a href="http://framework.zend.com/apidoc/core/Zend_Gdata/Gdata/Zend_Gdata_MediaMimeStream.html"&gt;Zend_Gdata_MediaMimeStream&lt;/a&gt; object which only stores a handle to the video file being uploaded. Jeff built a &lt;a href="http://framework.zend.com/apidoc/core/Zend_Gdata/Gdata/Zend_Gdata_HttpAdapterStreamingSocket.html"&gt;Zend_Gdata_HttpAdapterStreamingSocket&lt;/a&gt; which then reads from the media stream in 1 MB chunks and sends to the socket until the entire message is read. We have tested this code extensively and are always open to feedback on how to improve performance issues in our client library, so &lt;a href="http://framework.zend.com/code/changelog/Zend_Framework/?cs=14172"&gt;check out the source code&lt;/a&gt; if you are interested.&lt;br /&gt;&lt;br /&gt;While I have your attention, let me also share another trick for those obsessed with efficiency: If you are only interested in working with the raw XML instead of the complete Zend_Gdata object model, you can &lt;a href="http://framework.zend.com/apidoc/core/Zend_Gdata/App/Zend_Gdata_App.html#useObjectMapping"&gt;flip a minor switch&lt;/a&gt; that is available in all of our service classes (Zend_Gdata_YouTube, Zend_Gdata_Docs, etc.):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$yt = new Zend_Gdata_YouTube();&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;$yt-&gt;useObjectMapping(false);&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;$xmlString = $yt-&gt;getRecentlyFeaturedVideoFeed();&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;echo gettype($xmlString); # will return 'string'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As you can see in the snippet above, the &lt;span style="font-family:courier new;"&gt;$xmlString&lt;/span&gt; variable is now just a regular string instead of a &lt;a href="http://framework.zend.com/apidoc/core/Zend_Gdata/YouTube/Zend_Gdata_YouTube_VideoFeed.html"&gt;Zend_Gdata_VideoFeed&lt;/a&gt; object. My testing shows that this can make fetching video feeds from YouTube faster by up to 35 times. Of course you would need to add a little bit of time parsing the XML with the tool of your choice (&lt;a href="http://us2.php.net/manual/en/function.xpath-eval-expression.php"&gt;XPath&lt;/a&gt;, etc.). I should also add that those interested in parsing XML without the aid of the client library may want to check out the &lt;a href="http://code.google.com/intl/en/apis/youtube/compatibility_guidelines.html"&gt;Backward Compatibility Guidelines&lt;/a&gt; for the YouTube Data API.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-6545573234468869982?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/07-zesr3oII" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/6545573234468869982?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/6545573234468869982?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/07-zesr3oII/php-client-library-uploading-videos-now.html" title="PHP Client Library: Uploading videos now 99% more efficient !" /><author><name>Jochen Hartmann</name><email>noreply@blogger.com</email></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_B8HA18T3qlI/SaxaQm_coMI/AAAAAAAAAAc/lV-8vq5q_LM/s72-c/99percent_final.jpg" height="72" width="72" /><feedburner:origLink>http://apiblog.youtube.com/2009/03/php-client-library-uploading-videos-now.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4HQnw5fyp7ImA9WxVWFU8.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-884493722896102129</id><published>2009-02-24T16:00:00.000-08:00</published><updated>2009-02-24T16:15:33.227-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-24T16:15:33.227-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><title>YouTube API Outgrows Shy Adolescence, Now Social</title><content type="html">&lt;i&gt;Posted by Stephanie Liu, YouTube APIs and Tools Team&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6NxOo7yjlR4/SaSLPiFNyoI/AAAAAAAAADQ/BnLszchp7-Q/s1600-h/Picture+3.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 122px; height: 200px; border: none;" src="http://2.bp.blogspot.com/_6NxOo7yjlR4/SaSLPiFNyoI/AAAAAAAAADQ/BnLszchp7-Q/s200/Picture+3.png" alt="" id="BLOGGER_PHOTO_ID_5306519359912266370" border="0" /&gt;&lt;/a&gt;YouTube has been &lt;a href="http://www.youtube.com/blog?entry=Vp8bYKTy35U" id="d-6x" title="getting more social"&gt;getting more social&lt;/a&gt; lately, using activity feeds to make it easier to find cool videos and channels that your YouTube friends are favoriting, rating, subscribing to, etc. But what if all your friends aren't on YouTube, but rather on social network / site XYZ?&lt;br /&gt;&lt;br /&gt;Well, my friends, the API has come out of its awkward teenage years, and now has more sophisticated social skills to help. Activities like favoriting, uploading, commenting, and more can now be integrated into the social context of your choice. Check out the &lt;a href="http://code.google.com/apis/youtube/2.0/developers_guide_protocol.html#Activity_feeds" id="p-0m" title="docs"&gt;docs&lt;/a&gt; for the new user activity feed and friend activity feed.&lt;br /&gt;&lt;br /&gt;Before you ask, the user activity feed is &lt;a href="http://www.youtube.com/account#privacy/activity" id="gagq" title="fully customizable"&gt;fully customizable&lt;/a&gt; by the user, and the corresponding feed through the API respects all privacy settings. So users still have full control over what they make available in their recent activity feed.&lt;br /&gt;&lt;br /&gt;We think some cool apps can be made with these feeds -- like the obvious social network / feed aggregator integrations, to notification apps, to novel data views. We can't wait to see what you guys make!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.googlecodesamples.com/youtube/php/YouTubeActivityViewer"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 160px; height: 200px; border: none;" src="http://1.bp.blogspot.com/_6NxOo7yjlR4/SaSM_Fn-ubI/AAAAAAAAADg/8pt2nI4OGUE/s200/phpsamplethumb.jpg" alt="" id="BLOGGER_PHOTO_ID_5306521276418800050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Get started by perusing the docs and playing with the sample. Besides the &lt;a href="http://code.google.com/apis/youtube/2.0/developers_guide_protocol.html#Activity_feeds" id="ly3q" title="protocol guide"&gt;protocol guide&lt;/a&gt;, we've also updated the &lt;a href="http://code.google.com/apis/youtube/2.0/developers_guide_java.html#Activity_feeds" id="q1sy" title="Java"&gt;Java&lt;/a&gt; and &lt;a href="http://code.google.com/apis/youtube/2.0/developers_guide_php.html#Activity_feeds" id="g7xl" title="PHP"&gt;PHP&lt;/a&gt; guides with helpful snippets. An &lt;a href="http://www.googlecodesamples.com/youtube/php/YouTubeActivityViewer/" id="b80y" title="activity viewer sample"&gt;activity viewer sample&lt;/a&gt; written in PHP and its &lt;a href="http://code.google.com/p/gdata-samples/source/browse/#svn/branches/ytaviewer/1.0" id="jrmd" title="source"&gt;source code&lt;/a&gt; is also available for you to play with.&lt;br /&gt;&lt;br /&gt;As always, let us know if you have any questions or feedback in the &lt;a href="http://groups.google.com/group/youtube-api-gdata" id="peh7" title="forum"&gt;forum&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;PS. If you want to socialize with the team in person, come to &lt;a href="http://code.google.com/io" id="cfi1" title="Google I/O"&gt;Google I/O&lt;/a&gt;, where we'll be giving a &lt;a href="http://code.google.com/events/io/sessions.html" id="lxdt" title="session"&gt;session&lt;/a&gt; on "Going social with the YouTube APIs"!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-884493722896102129?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/OudJKbyermI" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/884493722896102129?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/884493722896102129?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/OudJKbyermI/youtube-api-outgrows-shy-adolescence.html" title="YouTube API Outgrows Shy Adolescence, Now Social" /><author><name>Stephanie Liu</name><uri>http://www.blogger.com/profile/08457117592361473057</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="06938078375332321706" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_6NxOo7yjlR4/SaSLPiFNyoI/AAAAAAAAADQ/BnLszchp7-Q/s72-c/Picture+3.png" height="72" width="72" /><feedburner:origLink>http://apiblog.youtube.com/2009/02/youtube-api-outgrows-shy-adolescence.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ECRHs4eCp7ImA9WxVXE0Q.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-8258805918233807315</id><published>2009-02-11T16:34:00.000-08:00</published><updated>2009-02-11T16:47:45.530-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-11T16:47:45.530-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="as3" /><category scheme="http://www.blogger.com/atom/ns#" term="tutorials" /><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><category scheme="http://www.blogger.com/atom/ns#" term="code" /><category scheme="http://www.blogger.com/atom/ns#" term="devs" /><title>TubeLoc: An AS3 Player Wrapper Using LocalConnection</title><content type="html">&lt;em&gt;Posted by Jeff Fisher, YouTube APIs and Tools Team&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;We know developers really like AS3, but sometimes they have difficulty getting our players to work correctly. To make this process easier for the Flashy/Flexy crowd, the awesome Ben Longoria has given us &lt;a href="http://code.google.com/p/tubeloc/"&gt;TubeLoc&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3bO2g9UbC5k/SZNxMmaRnOI/AAAAAAAAABg/c9XZUfVT5Aw/s1600-h/chromeless_screenshot.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 198px;" src="http://1.bp.blogspot.com/_3bO2g9UbC5k/SZNxMmaRnOI/AAAAAAAAABg/c9XZUfVT5Aw/s320/chromeless_screenshot.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5301705647628328162" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;TubeLoc is an AS3 wrapper around the Player API that uses LocalConnection to communicate to the AS2 YouTube SWFs. It takes this a step further by also providing Flex components to make inserting a YouTube video and controls easy.&lt;br /&gt;&lt;br /&gt;Ready to get started? First &lt;a href="http://code.google.com/apis/youtube/articles/tubeloc.html"&gt;read the article&lt;/a&gt; that goes in depth on how to use TubeLoc. Next, visit the &lt;a href="http://code.google.com/p/tubeloc/"&gt;project page&lt;/a&gt; to download the code and play with the live demos. Finally, tell us what you think &lt;a href="http://groups.google.com/group/youtube-api-gdata"&gt;on the forum&lt;/a&gt;. Thanks Ben!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-8258805918233807315?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/xcachFnrxbc" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/8258805918233807315?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/8258805918233807315?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/xcachFnrxbc/tubeloc-as3-player-wrapper-using.html" title="TubeLoc: An AS3 Player Wrapper Using LocalConnection" /><author><name>Jeff Fisher</name><email>noreply@blogger.com</email></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_3bO2g9UbC5k/SZNxMmaRnOI/AAAAAAAAABg/c9XZUfVT5Aw/s72-c/chromeless_screenshot.png" height="72" width="72" /><feedburner:origLink>http://apiblog.youtube.com/2009/02/tubeloc-as3-player-wrapper-using.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEANRnkzeip7ImA9WxVXFEs.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-1727461926076384437</id><published>2009-02-05T15:00:00.000-08:00</published><updated>2009-02-12T11:26:37.782-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-12T11:26:37.782-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="samples" /><category scheme="http://www.blogger.com/atom/ns#" term="tutorials" /><category scheme="http://www.blogger.com/atom/ns#" term="code" /><category scheme="http://www.blogger.com/atom/ns#" term="iphone" /><title>YouTube APIs + iPhone = Cool mobile apps</title><content type="html">&lt;span style="font-style: italic;"&gt;Posted by Kuan Yong, YouTube APIs and Tools Team&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The YouTube APIs &lt;a href="http://code.google.com/apis/youtube/terms.html" target="_blank"&gt;Terms of Service&lt;/a&gt; permits commercial use of the APIs &lt;a href="http://apiblog.youtube.com/2009/02/show-me-money.html"&gt;under certain conditions&lt;/a&gt;, and in most cases, as long as you play fair, you are free (and highly encouraged) to develop great iPhone apps using the YouTube APIs and sell them in the iTunes App Store.&lt;br /&gt;&lt;br /&gt;An iPhone app that uses the YouTube APIs typically needs to do two things:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Call the YouTube API Data API to search videos, get video metadata, etc. You should use our &lt;a href="http://code.google.com/apis/youtube/code.html" target="_blank"&gt;Objective C client library&lt;/a&gt; instead of trying to construct the HTTP request or parse the response by hand.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Invoke the native YouTube player on the iPhone to play videos.&lt;/li&gt;&lt;/ul&gt;There are at least two ways to play YouTube videos in your iPhone app (that don't run afoul of Apple's SDK rules). The easier way requires just one line of code but it involves quitting your app and launching the full YouTube app on the phone. The better way needs a little more setup but provides a seamless way of taking the user to the YouTube player and back to your app. &lt;span style="font-weight: bold;"&gt;Note that these two methods work only on an actual device, not in the iPhone simulator, since the latter does not have a YouTube player.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Method 1: Open the YouTube play page URL (Easier)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;1. Grab the video url from the &lt;media:content&gt; media tag in the API response with the &lt;span style="font-family:courier new;"&gt;application/x-shockwave-flash&lt;/span&gt; type. It should look something like this:&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;http://www.youtube.com/v/&lt;/span&gt;&lt;wbr  style="font-family:courier new;"&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;oHg5SJYRHA0&amp;amp;f=gdata_videos&amp;amp;c=&lt;/span&gt;&lt;wbr  style="font-family:courier new;"&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;ytapi-my-clientID&amp;amp;d=&lt;/span&gt;&lt;wbr  style="font-family:courier new;"&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;nGF83uyVrg8eD4rfEkk22mDOl3qUIm&lt;/span&gt;&lt;wbr  style="font-family:courier new;"&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;VMV6ramM&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you don't see the &lt;span style="font-family:courier new;"&gt;c&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;d&lt;/span&gt; parameters in the URL, it's because you are not passing in your developer key and client ID in the request. While they are not mandatory for read requests, we highly recommend that you provide them in &lt;span style="font-style: italic;"&gt;every&lt;/span&gt; API request.&lt;br /&gt;&lt;br /&gt;2. Open the URL in your app by calling the openURL method on your UIApplication instance:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;http://www.&lt;/span&gt;&lt;wbr  style="font-family:courier new;"&gt;&lt;span style="font-family:courier new;"&gt;youtube.com/v/oHg5SJYRHA0&amp;amp;f=&lt;/span&gt;&lt;wbr  style="font-family:courier new;"&gt;&lt;span style="font-family:courier new;"&gt;gdata_videos&amp;amp;c=ytapi-my-&lt;/span&gt;&lt;wbr  style="font-family:courier new;"&gt;&lt;span style="font-family:courier new;"&gt;clientID&amp;amp;d=&lt;/span&gt;&lt;wbr  style="font-family:courier new;"&gt;&lt;span style="font-family:courier new;"&gt;nGF83uyVrg8eD4rfEkk22mDOl3qUIm&lt;/span&gt;&lt;wbr  style="font-family:courier new;"&gt;&lt;span style="font-family:courier new;"&gt;VMV6ramM&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;"]]; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When your app calls openURL, it will quit and launch the full native YouTube app on the phone. After the video stops playing, the user remains in the YouTube app. The user has no easy way of getting back to your app.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Method 2: Embed the YouTube player in a UIWebView&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;No, the iPhone still doesn't do Flash, but if you haven't already noticed, the Safari browser on the iPhone is clever enough to turn any YouTube embed into a clickable thumbnail that launches the native YouTube player app on the phone. You can take advantage of this feature in your app by using a UIWebView. Here's how:&lt;br /&gt;&lt;br /&gt;1. Set up a UIWebView in your app. You can make it part of a xib or create it programmatically. Size the UIWebView according to how large you want the clickable thumbnail to be.&lt;br /&gt;&lt;br /&gt;2. Grab the video url using the same method as the one described above.&lt;br /&gt;&lt;br /&gt;3. Call the &lt;span style="font-family:courier new;"&gt;loadHTMLString:baseURL:&lt;/span&gt; method on the UIWebView instance with some carefully constructed HTML that contains the YouTube embedded player code snippet and some supporting HTML to make sure that the video thumbnail appears correctly. Set the base URL to the URL of your website (it doesn't do anything here -- ordinarily UIWebView uses it to handle relative URL links correctly).&lt;br /&gt;&lt;br /&gt;The best way to illustrate this is with a code snippet. Note the use of the &lt;span style="font-family:courier new,monospace;"&gt;viewport &lt;/span&gt;HTML meta parameter and the consistent use of &lt;span style="font-family:courier new;"&gt;width&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;height&lt;/span&gt; parameters throughout.&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;// webView is a UIWebView, either initialized programmatically or loaded as part of a xib.&lt;br /&gt;&lt;br /&gt;NSString *htmlString = @"&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta name = \"viewport\" content = \"initial-scale = 1.0, user-scalable = no, width = 212\"/&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body style=\"background:#F00;margin-top:0px;margin-left:0px\"&amp;gt;&lt;br /&gt;&amp;lt;div&amp;gt;&amp;lt;object width=\"212\" height=\"172\"&amp;gt;&lt;br /&gt;&amp;lt;param name=\"movie\" value=\"http://www.youtube.com/v/oHg5SJYRHA0&amp;amp;f=gdata_videos&amp;amp;c=ytapi-my-clientID&amp;amp;d=nGF83uyVrg8eD4rfEkk22mDOl3qUImVMV6ramM\"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;lt;param name=\"wmode\" value=\"transparent\"&amp;gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;lt;embed src=\"http://www.youtube.com/v/oHg5SJYRHA0&amp;amp;f=gdata_videos&amp;amp;c=ytapi-my-clientID&amp;amp;d=nGF83uyVrg8eD4rfEkk22mDOl3qUImVMV6ramM\"&lt;br /&gt;type=\"application/x-shockwave-flash\" wmode=\"transparent\" width=\"212\" height=\"172\"&amp;gt;&amp;lt;/embed&amp;gt;&lt;br /&gt;&amp;lt;/object&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;";&lt;br /&gt;&lt;br /&gt;[webView loadHTMLString:htmlString baseURL:[NSURL URLWithString:@"http://www.your-url.com"]];&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;One of the biggest benefits of this approach is that your app does not have to quit in order for the video to start playing. In fact, the iPhone will keep your app running in the background while it fires up the YouTube player to play the video. After the video finishes playing (or when the user hits "Done"), the user is automatically taken back to your app. This experience is very similar to watching embedded YouTube videos in the iPhone Safari browser and is just as seamless.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Have fun writing the next killer iPhone app, and don't forget to list your app in the &lt;a href="http://youtube-gallery.appspot.com/" target="_blank"&gt;YouTube Project Gallery&lt;/a&gt; once it goes live in the App Store!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Coming up: Adding YouTube content to Android apps&lt;/span&gt;&lt;br /&gt;&lt;/media:content&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-1727461926076384437?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/ajsJkzv6OcA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://apiblog.youtube.com/feeds/1727461926076384437/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=2443724041307041823&amp;postID=1727461926076384437" title="17 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/1727461926076384437?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/1727461926076384437?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/ajsJkzv6OcA/youtube-apis-iphone-cool-mobile-apps.html" title="YouTube APIs + iPhone = Cool mobile apps" /><author><name>Kuan Yong</name><uri>http://www.blogger.com/profile/16935301056658837962</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03469350828253255920" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">17</thr:total><feedburner:origLink>http://apiblog.youtube.com/2009/02/youtube-apis-iphone-cool-mobile-apps.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcMR387eSp7ImA9WxVQGEs.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-4380463762054911934</id><published>2009-02-04T18:00:00.000-08:00</published><updated>2009-02-05T13:08:06.101-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-05T13:08:06.101-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><title>Show Me the Money</title><content type="html">&lt;span style="font-style: italic;"&gt;Posted by Kuan Yong, YouTube APIs Product Manager&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Money: it's on &lt;a href="http://youtube.com/watch?v=WRVzF9dBl7c"&gt;everyone's mind lately&lt;/a&gt;, and we know developers are no different. We understand that developers aren't just satisfied with creating the coolest YouTube mashup out there. They also want a way to sustain their efforts financially, and the trick is figuring out how to do so appropriately. That's why we've published a &lt;a href="http://code.google.com/apis/youtube/creating_monetizable_applications.html"&gt;document&lt;/a&gt; that provides clear guidance on how you can monetize the apps you've built with the YouTube APIs. While it is not a substitute for reading our &lt;a href="http://code.google.com/apis/youtube/terms.html"&gt;Terms of Service&lt;/a&gt;, it should point you to the clauses you should pay attention to and hopefully even give you some ideas for your next YouTube API-powered project.&lt;br /&gt;&lt;br /&gt;So go ahead, launch the next great YouTube mashup, and monetize the hell out of it. And don't forget to tell us about your app at the &lt;a href="http://youtube-gallery.appspot.com/"&gt;YouTube Project Gallery&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-4380463762054911934?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/DDAs0uJVDHU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://apiblog.youtube.com/feeds/4380463762054911934/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=2443724041307041823&amp;postID=4380463762054911934" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/4380463762054911934?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/4380463762054911934?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/DDAs0uJVDHU/show-me-money.html" title="Show Me the Money" /><author><name>Kuan Yong</name><uri>http://www.blogger.com/profile/16935301056658837962</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="03469350828253255920" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://apiblog.youtube.com/2009/02/show-me-money.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYAQHc8eCp7ImA9WxVQEko.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-894078322719901746</id><published>2009-01-29T14:55:00.000-08:00</published><updated>2009-01-29T15:02:21.970-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-29T15:02:21.970-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="office hours" /><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><category scheme="http://www.blogger.com/atom/ns#" term="irc" /><title>Next IRC Office Hours: Wednesday, Feb. 4th, 1:00 - 3:00pm PST</title><content type="html">&lt;span style="font-style: italic;"&gt;Posted by Stephanie Liu, YouTube APIs and Tools Team&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Last week, we had a grand ol' time troubleshooting some issues, chatting about the player, making some new friends, and salivating over a &lt;a title="Dark Chocolate Bacon Cupcakes" href="http://allrecipes.com/Recipe/Dark-Chocolate-Bacon-Cupcakes/Detail.aspx" id="z92c"&gt;Dark Chocolate Bacon Cupcakes&lt;/a&gt;  recipe. So, we'll be holding office hours again next week, same bat time, same bat channel.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Where:&lt;/b&gt; irc.freenode.net#youtube-api&lt;br /&gt;&lt;b&gt;When:&lt;/b&gt; Wednesday, February 4th, 1:00 - 3:00 pm PST&lt;br /&gt;&lt;b&gt;Who:&lt;/b&gt; Look for&lt;b&gt; xirzec&lt;/b&gt;, &lt;b&gt;stephliu&lt;/b&gt;, and&lt;b&gt; jh_youtube&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Let us know if you'd prefer a different time for future office hours, or just post your questions in our &lt;a title="discussion forum" href="http://groups.google.com/group/youtube-api-gdata" id="r5jm"&gt;discussion forum&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-894078322719901746?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/lj8uhmQoa0c" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/894078322719901746?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/894078322719901746?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/lj8uhmQoa0c/next-weeks-irc-office-hours-wednesday.html" title="Next IRC Office Hours: Wednesday, Feb. 4th, 1:00 - 3:00pm PST" /><author><name>Stephanie Liu</name><uri>http://www.blogger.com/profile/08457117592361473057</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="06938078375332321706" /></author><feedburner:origLink>http://apiblog.youtube.com/2009/01/next-weeks-irc-office-hours-wednesday.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MARXs4eip7ImA9WxVREU4.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-5554792413253780479</id><published>2009-01-14T10:11:00.000-08:00</published><updated>2009-01-16T10:44:04.532-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-16T10:44:04.532-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><category scheme="http://www.blogger.com/atom/ns#" term="irc" /><title>Inaugural IRC Office Hours: Wed, Jan. 21st, 1-3pm PST</title><content type="html">&lt;span style="font-style: italic;"&gt;Posted by Stephanie Liu, YouTube APIs and Tools Team&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Starting next week, we'll be hosting live office hours on IRC (&lt;span style="font-weight: bold;"&gt;irc.freenode.net &lt;/span&gt;channel &lt;span style="font-weight: bold;"&gt;#youtube-api&lt;/span&gt;). Come ask your questions, give feedback, gossip about the latest Atom Pub news, share best practices, or just hang out.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Where:&lt;/span&gt; irc.freenode.net#youtube-api&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;When:&lt;/span&gt; Wednesday, January 21st, 1:00 - 3:00 pm PST&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Who:&lt;/span&gt; Look for&lt;span style="font-weight: bold;"&gt; xirzec&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;stephliu&lt;/span&gt;, and&lt;span style="font-weight: bold;"&gt; jh_youtube&lt;/span&gt;, we'll be the cool kids in the back :)&lt;br /&gt;&lt;br /&gt;If you can't make it, no worries, you can still post, as always, in the &lt;a href="http://groups.google.com/group/youtube-api-gdata"&gt;discussion forum&lt;/a&gt;. You can also let us know what times would work better for you in the future. See you there!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UPDATE:&lt;/span&gt; Small change. We'll be hosting hours 1-3 PST, not PDT :) Also, for those of you who don't have IRC clients installed, you may want to use a web-based client like mibbit.com. Choose "Freenode" as the server, pick a nickname, and use #youtube-api as the channel.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-5554792413253780479?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/mi1flOqlQ9U" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/5554792413253780479?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/5554792413253780479?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/mi1flOqlQ9U/inaugural-irc-office-hours-wed-jan-21st.html" title="Inaugural IRC Office Hours: Wed, Jan. 21st, 1-3pm PST" /><author><name>Stephanie Liu</name><uri>http://www.blogger.com/profile/08457117592361473057</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="06938078375332321706" /></author><feedburner:origLink>http://apiblog.youtube.com/2009/01/inaugural-irc-office-hours-wed-jan-21st.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YHQ3k6eSp7ImA9WxVSE0g.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-1159315438319650848</id><published>2009-01-07T10:48:00.000-08:00</published><updated>2009-01-07T11:05:32.711-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-07T11:05:32.711-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="samples" /><category scheme="http://www.blogger.com/atom/ns#" term="as3" /><category scheme="http://www.blogger.com/atom/ns#" term="tutorials" /><category scheme="http://www.blogger.com/atom/ns#" term="code" /><title>Flex + the Embedded Player: A Christmas Story</title><content type="html">&lt;em&gt;Posted by Pamela Fox, Maps API Team&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Hey YouTube folks! My name is Pamela Fox, and I hail from the Maps API world. I was charged with the task this year of creating the map for the &lt;a href="http://www.noradsanta.org/"&gt;NORAD Santa Tracker&lt;/a&gt; (yes, Google even indexes Santa), and I decided to convert last year's JavaScript map into a Flex map. This meant converting every feature into Flex, including arguably the most important feature: displaying YouTube-hosted Santa Cam videos in the infowindows. The kiddies get a kick out of seeing Santa soaring, tumbling, and freewheeling through the endless diamond sky. &lt;br /&gt;&lt;br /&gt;I wanted what I thought was a basic feature: using the embedded player to play 23 different YouTube videos in  the same Flex app. I started with a straightforward implementation - using the SWFLoader Flex component with the  source set to the URL of the YouTube video. But I noticed some funny behavior - the first video would load, but none after that. After some searching around, I discovered the reason for this: if the first loaded YouTube SWF isn't properly removed by calling its destroy method(), any subsequently loaded YouTube SWF won't play correctly. The solution is to call destroy() on the YouTube SWF - but wait a second, it's not that easy. Flex/AS3 SWFs cannot call methods on AS2 SWFs, and YouTube SWFs are indeed written in AS2. &lt;br /&gt;&lt;br /&gt;After harassing various YouTube engineers and reading through the AS3 Chromeless Player wrapper code, I came up with the solution shown in the diagram below.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_3bO2g9UbC5k/SWT7sIBRWZI/AAAAAAAAABQ/qiqud9d5Fas/s1600-h/clientdiagramjpeg.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 215px;" src="http://4.bp.blogspot.com/_3bO2g9UbC5k/SWT7sIBRWZI/AAAAAAAAABQ/qiqud9d5Fas/s400/clientdiagramjpeg.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5288628597925435794" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;The Flex app uses SWFLoader to load in an AS2 SWF, which I call the "YouTube bridge". The YouTube bridge creates a &lt;a href="http://livedocs.adobe.com/flex/2/langref/flash/net/LocalConnection.html"&gt;LocalConnection&lt;/a&gt;, which is a way for any SWF to invoke methods on any other SWF that's open simultaneously on a computer. The bridge specifies what connection it can receive commands from, and then defines two functions that other SWFs can call - loadMovie() and dispose(). The loadMovie() function takes in a YouTube ID, creates a MovieClip and loads the YouTube movie into it. The dispose() function calls destroy() on that MovieClip, and then does various other cleanup operations. The Flex app then tells that same connection what method names it wants to invoke, either "loadMovie" or "dispose". Some snippets of the LocalConnection code are shown below:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// Flex&lt;br /&gt;outBox = new LocalConnection(); &lt;br /&gt;outBox.send(outBoxName, "dispose");&lt;br /&gt;outBox.send(outBoxName, "loadMovie", ids[counter]);&lt;br /&gt;&lt;br /&gt;// AS2&lt;br /&gt;var inbox = new LocalConnection();&lt;br /&gt;inbox.connect(_root.boxName);&lt;br /&gt;inbox.dispose = function () {&lt;br /&gt;  youtubeMC.destroy();&lt;br /&gt;  ...&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;When I first coded this, I hard-coded a name for the connection name in the Flex + AS2. This meant that my app couldn't be used in multiple browsers at the same time, since all instances of the app would be sending and receiving messages from the same inbox, and they'd get awfully confused. To remedy that, I generate a random ID in the Flex app, pass that into the query string when loading the YouTube bridge, and then have the bridge use the value of the query parameter as the inbox name. A snippet of that code is shown below:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// Flex&lt;br /&gt;outBoxName = String(new Date().getUTCMilliseconds()); &lt;br /&gt;swfLoader.load("youtubebridge.swf?boxName=" + outBoxName);&lt;br /&gt;&lt;br /&gt;// AS2&lt;br /&gt;inbox.connect(_root.boxName);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://pamelafox-samplecode.googlecode.com/svn/trunk/youtubeflex/src/"&gt;full code (MXML + FLA)&lt;/a&gt; is available, and you can test out the &lt;a href="http://pamelafox-samplecode.googlecode.com/svn/trunk/youtubeflex/bin-release/YoutubeEmbedTest.html"&gt;demo app&lt;/a&gt;. Now that I've made it easy for you all, I hope to see some nifty YouTube/Flex mashups.. and maybe even some Youtube/Flex/Maps mashups!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-1159315438319650848?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/Zjg5MkYLf1Y" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/1159315438319650848?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/1159315438319650848?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/Zjg5MkYLf1Y/flex-embedded-player-christmas-story.html" title="Flex + the Embedded Player: A Christmas Story" /><author><name>Jeff Fisher</name><email>noreply@blogger.com</email></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_3bO2g9UbC5k/SWT7sIBRWZI/AAAAAAAAABQ/qiqud9d5Fas/s72-c/clientdiagramjpeg.jpg" height="72" width="72" /><feedburner:origLink>http://apiblog.youtube.com/2009/01/flex-embedded-player-christmas-story.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YMQ388cCp7ImA9WxRaFUg.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-4863797266274480401</id><published>2008-12-17T13:53:00.005-08:00</published><updated>2008-12-17T13:59:42.178-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-17T13:59:42.178-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><category scheme="http://www.blogger.com/atom/ns#" term="survey" /><title>YouTube Developer Happiness Survey</title><content type="html">&lt;span style="font-style: italic;"&gt;Posted by Stephanie Liu, YouTube APIs and Tools Team&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6NxOo7yjlR4/SUl10tJ_OtI/AAAAAAAAADE/wZtmrfav4wo/s1600-h/youtube-love-devs%282%29.png"&gt;&lt;img style="border: medium none ; margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 125px; height: 81px;" src="http://1.bp.blogspot.com/_6NxOo7yjlR4/SUl10tJ_OtI/AAAAAAAAADE/wZtmrfav4wo/s200/youtube-love-devs%282%29.png" alt="" id="BLOGGER_PHOTO_ID_5280881586403752658" border="0" /&gt;&lt;/a&gt;It's that time again -- survey time. If you're a YouTube API&lt;br /&gt;developer, we'd love to know how it's going and what we can do better. Take a few minutes and fill out our &lt;a href="http://spreadsheets.google.com/viewform?key=pFrmMi8feTQYK074Rx6eIbg"&gt;survey&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We always welcome feedback in the &lt;a href="http://%20groups.google.com/group/youtube-api-gdata"&gt;discussion forum&lt;/a&gt; of course, but this is a good way for the team to look at some aggregate data and determine where to put resources next year.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-4863797266274480401?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/p6l1YDZWU04" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/4863797266274480401?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/4863797266274480401?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/p6l1YDZWU04/youtube-developer-happiness-survey_17.html" title="YouTube Developer Happiness Survey" /><author><name>Stephanie Liu</name><uri>http://www.blogger.com/profile/08457117592361473057</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="06938078375332321706" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_6NxOo7yjlR4/SUl10tJ_OtI/AAAAAAAAADE/wZtmrfav4wo/s72-c/youtube-love-devs%282%29.png" height="72" width="72" /><feedburner:origLink>http://apiblog.youtube.com/2008/12/youtube-developer-happiness-survey_17.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUAQXw-eyp7ImA9WxRbGEs.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-8550926693006078009</id><published>2008-12-09T11:00:00.000-08:00</published><updated>2008-12-09T15:10:40.253-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-09T15:10:40.253-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="code" /><title>YouTube Google Desktop Gadget</title><content type="html">&lt;span style="font-style: italic;"&gt;Posted by James Yum, Google Desktop Team&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://desktop.google.com/"&gt;Google Desktop&lt;/a&gt; just got its own &lt;a href="http://desktop.google.com/plugins/i/youtubegadget.html"&gt;Desktop gadget&lt;/a&gt; for YouTube. It relies on &lt;a href="http://code.google.com/apis/youtube/2.0/reference.html"&gt;Data API&lt;/a&gt; feeds to search YouTube and retrieve a feed of the day's most popular videos. It's also &lt;a href="http://code.google.com/p/google-youtube-gadget/"&gt;open source&lt;/a&gt;, so browse the source code to learn how to build a desktop app that uses the YouTube APIs. If have any questions or feedback, send an email to gd-developer AT gmail DOT com.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_6NxOo7yjlR4/ST7Bow9GX-I/AAAAAAAAAC8/OooDfZZIcXA/s1600-h/desktop_gadget.png"&gt;&lt;img style="border: medium none ; margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 304px;" src="http://2.bp.blogspot.com/_6NxOo7yjlR4/ST7Bow9GX-I/AAAAAAAAAC8/OooDfZZIcXA/s400/desktop_gadget.png" alt="" id="BLOGGER_PHOTO_ID_5277868719404900322" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-8550926693006078009?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/9l5a1LV1y8A" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/8550926693006078009?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/8550926693006078009?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/9l5a1LV1y8A/youtube-google-desktop-gagdet.html" title="YouTube Google Desktop Gadget" /><author><name>Stephanie Liu</name><uri>http://www.blogger.com/profile/08457117592361473057</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="06938078375332321706" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_6NxOo7yjlR4/ST7Bow9GX-I/AAAAAAAAAC8/OooDfZZIcXA/s72-c/desktop_gadget.png" height="72" width="72" /><feedburner:origLink>http://apiblog.youtube.com/2008/12/youtube-google-desktop-gagdet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUBQ3c4eCp7ImA9WxRbEUU.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-3867382401653578108</id><published>2008-12-01T18:39:00.000-08:00</published><updated>2008-12-01T18:50:52.930-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-01T18:50:52.930-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tutorials" /><category scheme="http://www.blogger.com/atom/ns#" term="devs" /><title>YouTube Integration in Games</title><content type="html">&lt;i&gt;Guest Post by Claus &lt;/i&gt;&lt;i&gt;Höfele, Software Developer at Team Bondi&lt;br /&gt;&lt;/i&gt;&lt;a href="https://docs.google.com/a/google.com/File?id=cfsszxbv_273rqq7rgb_b" id="ym55" target="_blank"&gt;&lt;img src="https://docs.google.com/a/google.com/File?id=cfsszxbv_273rqq7rgb_b" style="margin: 1em 0pt 0pt 1em; width: 320px; float: right; height: 240px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;i&gt;We have a guest blog post today by Claus Höfele, an &lt;/i&gt;&lt;i&gt;Engine Programmer at Team Bondi, an independent &lt;/i&gt;&lt;i&gt;game developer based Down Under. He has a detailed &lt;a href="http://www.gamasutra.com/view/feature/3855/share_your_experience_youtube_.php?page=1" id="mzlw" title="article"&gt;article&lt;/a&gt; featured in &lt;a href="http://gamasutra.com/" id="tkdc" title="Gamasutra.com"&gt;Gamasutra.com&lt;/a&gt; about how to integrate YouTube upload into a game, much like how it's integrated in &lt;a href="http://apiblog.youtube.com/2008/06/fn-fried-macaroni-cheese-creativity-ea.html" id="b6ow" title="Spore"&gt;Spore&lt;/a&gt;. In addition to working with game consoles, Claus has a long history in developing software for mobile devices and is the author of &lt;a href="http://www.amazon.com/Mobile-3D-Graphics-Learning-Micro/dp/1598632922" id="see:" title="Mobile 3D Graphics: Learning 3D Graphics with the Java Micro Edition"&gt;Mobile 3D Graphics: Learning 3D Graphics with the Java Micro Edition&lt;/a&gt;.&lt;br /&gt;&lt;/i&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt; For some time now, I've been interested in how social networks can be incorporated into games. With the rise of multiplayer games, I believe this will be the next big thing for network-enabled games. Watching videos on YouTube is a favourite pastime of mine, so it didn't take long for me to decide that I wanted to check out the steps necessary to add a video recording feature to my games and share the recordings on YouTube.&lt;br /&gt;&lt;br /&gt;Games are often written in C/C++, which allows a programmer to structure the code in a modular way, but also to program to the bare metal when needed. Although YouTube announced a partnership with Sony in which it offered its APIs on the PLAYSTATION 3, there's no publicly available C/C++ API to access YouTube. Fortunately, with the help of the &lt;a href="http://code.google.com/apis/youtube/developers_guide_protocol.html" id="tpgr" title="developer documentation"&gt;developer documentation&lt;/a&gt;, YouTube's HTTP based protocol is straightforward to implement yourself. I used libcurl (HTTP processing), OpenSSL (HTTPS), and TinyXML (XML parsing) to help me with this task.&lt;br /&gt;&lt;br /&gt;Wrapping my head around the available authentication options was probably the most difficult task. In the end, ClientLogin was the method of choice because my game demo is distributed as a standalone desktop application.&lt;br /&gt;&lt;br /&gt;I was glad to see support for videos encoded in the Theora format on YouTube. Because Theora is a free and open video compression format, it avoids the licensing issues usually involved with video codecs.&lt;br /&gt;&lt;br /&gt;I expect more games to follow in the footsteps of &lt;a href="http://apiblog.youtube.com/2008/06/fn-fried-macaroni-cheese-creativity-ea.html"&gt;Spore's Creature Creator&lt;/a&gt;, &lt;a href="http://apiblog.youtube.com/2008/07/pixeljunk-eden-now-fortified-with.html"&gt;PixelJunk Eden&lt;/a&gt;, and &lt;a href="http://apiblog.youtube.com/2008/05/let-games-begin.html"&gt;Mainichi Issho&lt;/a&gt;, which already include YouTube support. The code that comes with my article on Gamasutra.com [&lt;a href="http://www.gamasutra.com/view/feature/3855/share_your_experience_youtube_.php" target="_blank"&gt;http://www.gamasutra.com/&lt;wbr&gt;view/feature/3855/share_your_&lt;wbr&gt;experience_youtube_.php&lt;/a&gt;] should provide an excellent start if you want to access YouTube from a game or application written in C/C++.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-3867382401653578108?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/uEJ0g0RRyKE" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/3867382401653578108?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/3867382401653578108?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/uEJ0g0RRyKE/youtube-integration-in-games.html" title="YouTube Integration in Games" /><author><name>Stephanie Liu</name><uri>http://www.blogger.com/profile/08457117592361473057</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="06938078375332321706" /></author><feedburner:origLink>http://apiblog.youtube.com/2008/12/youtube-integration-in-games.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUARHg4fip7ImA9WxRUFUo.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-7911574534605040691</id><published>2008-11-24T14:30:00.001-08:00</published><updated>2008-11-24T16:34:05.636-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-24T16:34:05.636-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><title>Application Gallery Launched - Submit Your Own!</title><content type="html">&lt;em&gt;Posted by Jeff Fisher, YouTube APIs and Tools Team&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;We launched a new &lt;a href="http://youtube-gallery.appspot.com/"&gt;Application Gallery&lt;/a&gt; to feature projects that integrate with YouTube. This supersedes our previous &lt;a href="http://groups.google.com/group/youtube-api/web/share-your-project"&gt;forum wiki page&lt;/a&gt; and now also allows you to rate and comment on your favorite applications.&lt;br /&gt;&lt;br /&gt;The new gallery is self-service so &lt;a href="http://youtube-gallery.appspot.com/submit"&gt;submit your application&lt;/a&gt; for inclusion today! Don't worry if your listing does not show up right away. We need a few days to review your app before including it in the gallery. If your app is rejected, please be sure to review our &lt;a href="http://code.google.com/apis/youtube/terms.html"&gt;API Terms of Service&lt;/a&gt; again. Keep it classy, guys.&lt;br /&gt;&lt;br /&gt;If you haven't written a YouTube app yet, this will be a great place to peruse examples and get inspiration.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-7911574534605040691?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/LEWRn2ZjfzE" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/7911574534605040691?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/7911574534605040691?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/LEWRn2ZjfzE/application-gallery-launched-submit.html" title="Application Gallery Launched - Submit Your Own!" /><author><name>Jeff Fisher</name><email>noreply@blogger.com</email></author><feedburner:origLink>http://apiblog.youtube.com/2008/11/application-gallery-launched-submit.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04CQH84fSp7ImA9WxRVGUk.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-127241131291464744</id><published>2008-11-17T10:12:00.000-08:00</published><updated>2008-11-17T10:19:21.135-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-17T10:19:21.135-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><title>Try Before You Buy</title><content type="html">&lt;span style="font-style: italic;"&gt;Posted by Stephanie Liu, YouTube APIs and Tools Team&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We launched a great tool to help you play around with the Data API and wrap your head around all the basic API operations before diving into code.&lt;br /&gt;&lt;br /&gt;Check it out:&lt;br /&gt;&lt;a href="http://gdata.youtube.com/demo/index.html"&gt;http://gdata.youtube.com/demo/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Build query strings, experiment with the different feeds, and even make authenticated queries using AuthSub. This is also a great way to help debug problems with the API and compare responses against what you are seeing in your code.&lt;br /&gt;&lt;br /&gt;Let us know if you have any feedback in &lt;a href="http://groups.google.com/group/youtube-api-gdata/"&gt;the forum&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-127241131291464744?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/whFkTnZLMgY" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/127241131291464744?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/127241131291464744?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/whFkTnZLMgY/try-before-you-buy.html" title="Try Before You Buy" /><author><name>Stephanie Liu</name><uri>http://www.blogger.com/profile/08457117592361473057</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="06938078375332321706" /></author><feedburner:origLink>http://apiblog.youtube.com/2008/11/try-before-you-buy.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIHSXczfip7ImA9WxRVFk8.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-8637794962221009669</id><published>2008-11-13T15:18:00.000-08:00</published><updated>2008-11-13T15:55:38.986-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-13T15:55:38.986-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><title>A Mandate for Change</title><content type="html">&lt;em&gt;Posted by Andy Diamondstein, YouTube APIs and Tools Team&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;In the past few months, thousands of you posted questions in our API forum, many for the very first time in your lives, because you believed that your voice could make a difference. You know that the YouTube API can change, and you've asked if we can change it by adding new features and fixing bugs. Yes we can.&lt;br /&gt;&lt;br /&gt;What we have already achieved gives us hope for what we can and must achieve tomorrow. But there is so much more to do. And we want to be sure that we don't break your applications when we do it. And that's why we've released new &lt;a href="http://code.google.com/apis/youtube/compatibility_guidelines.html"&gt;backward compatibility guidelines&lt;/a&gt; to help ensure that your applications handle API changes gracefully.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-8637794962221009669?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/gg5VKz9G-eU" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/8637794962221009669?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/8637794962221009669?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/gg5VKz9G-eU/mandate-for-change.html" title="A Mandate for Change" /><author><name>Jeff Fisher</name><email>noreply@blogger.com</email></author><feedburner:origLink>http://apiblog.youtube.com/2008/11/mandate-for-change.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMCQH4yfCp7ImA9WxRVFU8.&quot;"><id>tag:blogger.com,1999:blog-2443724041307041823.post-6147477100471065076</id><published>2008-11-12T14:18:00.000-08:00</published><updated>2008-11-12T14:21:01.094-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-12T14:21:01.094-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="announcements" /><title>All The World's A Stage</title><content type="html">&lt;em&gt;Posted by Jeff Fisher, YouTube APIs and Tools Team&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I know as a developer it is frustrating when your code that was previously working suddenly breaks because of someone else's changes. In order to help catch new API bugs before they show up in our production API, we have added a new staged version of our API running on stage.gdata.youtube.com.&lt;br /&gt;&lt;br /&gt;To use the staged instance, simply retrieve a feed from the different hostname. For example, instead of retrieving&lt;br /&gt;&lt;br /&gt;http://gdata.youtube.com/feeds/api/videos&lt;br /&gt;&lt;br /&gt;you would retrieve&lt;br /&gt;&lt;br /&gt;http://stage.gdata.youtube.com/feeds/api/videos&lt;br /&gt;&lt;br /&gt;For uploads you can use:&lt;br /&gt;&lt;br /&gt;http://uploads.stage.gdata.youtube.com/&lt;br /&gt;&lt;br /&gt;This staged instance is not supported and will not have the reliability of the live API, so please do not use it in any live site. It is only to be used for testing your application against upcoming versions of the API to ensure that nothing is broken.&lt;br /&gt;&lt;br /&gt;Go ahead and test your applications right now for the upcoming November release. In the future, we will pre-announce new versions of the API on stage once they are available on our announcement-only forum:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://groups.google.com/group/youtube-api"&gt;http://groups.google.com/group/youtube-api&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2443724041307041823-6147477100471065076?l=apiblog.youtube.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/YoutubeApiBlog/~4/JobzapaxFU8" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/6147477100471065076?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2443724041307041823/posts/default/6147477100471065076?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/YoutubeApiBlog/~3/JobzapaxFU8/all-worlds-stage.html" title="All The World's A Stage" /><author><name>Jeff Fisher</name><email>noreply@blogger.com</email></author><feedburner:origLink>http://apiblog.youtube.com/2008/11/all-worlds-stage.html</feedburner:origLink></entry></feed>
