<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-5506959918991245132</id><updated>2009-06-24T06:55:31.796-05:00</updated><title type='text'>beaTunes News</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.beatunes.com/news/atom.xml'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default?start-index=26&amp;max-results=25'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>110</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-9198999062603426727</id><published>2009-06-24T04:58:00.003-05:00</published><updated>2009-06-24T06:54:17.601-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Snow Leopard'/><category scheme='http://www.blogger.com/atom/ns#' term='Early Access'/><category scheme='http://www.blogger.com/atom/ns#' term='Release'/><title type='text'>64bit, the 2nd</title><content type='html'>&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo"&gt;&lt;/a&gt;If you are running Snow Leopard or some other 64bit VM, feel free to check out this 64 bit Early Access version of beaTunes. It probably still has some visual problems, but should more or less work.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.beatunes.com/download/beaTunes-2-0-10-osx-64.dmg"&gt;beaTunes-2-0-10-osx-64.dmg&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Feedback is very welcome!&lt;/p&gt;&lt;p&gt;&lt;em&gt;Update:&lt;/em&gt; There were some things wrong with this one, so I updated the build. Same link. Give it a shot.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-9198999062603426727?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/9198999062603426727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=9198999062603426727' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/9198999062603426727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/9198999062603426727'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/06/64bit-2nd.html' title='64bit, the 2nd'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-9054985223997745049</id><published>2009-06-15T05:13:00.005-05:00</published><updated>2009-06-15T05:22:08.831-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Harmonic Mixing'/><category scheme='http://www.blogger.com/atom/ns#' term='Wikipedia'/><title type='text'>beaTunes on Wikipedia - lots of room for improvement</title><content type='html'>&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo"&gt;&lt;/a&gt;Back in April I &lt;a href="http://www.beatunes.com/news/2009/04/who-will-create-wikipedia-entry-about.html"&gt;posted&lt;/a&gt; about the &lt;a href="http://en.wikipedia.org/wiki/BeaTunes"&gt;beaTunes entry on Wikipedia&lt;/a&gt;. Somebody was so nice to create the entry, but unfortunately it still has a broken link, it is not linked to from other pages and the entry itself isn't all that accurate. I tried to follow Wikipedia procedure and added some comments on the &lt;a href="http://en.wikipedia.org/wiki/Talk:BeaTunes"&gt;article's discussion page&lt;/a&gt; and notified involved authors, but nobody made the necessary changes.&lt;/p&gt;&lt;p&gt;If you feel like you'd like to contribute to Wikipedia, please correct and improve the &lt;a href="http://en.wikipedia.org/wiki/BeaTunes"&gt;beaTunes entry&lt;/a&gt;!&lt;/p&gt;&lt;p&gt;Thanks!&lt;/p&gt;&lt;p&gt;... and if you feel the German Wikipedia should have a beaTunes entry as well, please create it!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-9054985223997745049?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/9054985223997745049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=9054985223997745049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/9054985223997745049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/9054985223997745049'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/06/beatunes-on-wikipedia-lots-of-room-for.html' title='beaTunes on Wikipedia - lots of room for improvement'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-7899741038104017237</id><published>2009-05-27T11:33:00.004-05:00</published><updated>2009-05-27T12:48:24.022-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Snow Leopard'/><category scheme='http://www.blogger.com/atom/ns#' term='Early Access'/><category scheme='http://www.blogger.com/atom/ns#' term='Release'/><title type='text'>64 bit beaTunes Beta for Snow Leopard</title><content type='html'>&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo"&gt;&lt;/a&gt;For a while now, Apple has handed out developer seeds of its next generation operating system dubbed &lt;em&gt;Snow Leopard&lt;/em&gt;. Its focus lies on making OS X a true 64 bit operating system. For us developers this means that the old 32 bit QuickTime API will probably not work anymore.&lt;/p&gt;&lt;p&gt;And because the regular beaTunes still has some dependencies to QuickTime and is also still compatible with OS X 10.4, you can't just run it on Snow Leopard.&lt;/p&gt;&lt;p&gt;But! I'm working on migrating beaTunes to 64 bit. Unfortunately, as a side effect, I will have to drop support for OS X 10.4.&lt;/p&gt;&lt;p&gt;If you are running Snow Leopard, feel free to check out this 64 bit Early Access version of beaTunes. It still has some visual problems (e.g. the toolbar has the wrong gradient), but it should more or less work.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.beatunes.com/download/beaTunes-2-0-8-osx-64.dmg"&gt;beaTunes-2-0-8-osx-64.dmg&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Feedback is very welcome!&lt;/p&gt;&lt;p&gt;&lt;em&gt;Update:&lt;/em&gt; Seems like this build is working fine on Leopard 64 bit, but not yet in Snow Leopard. Analysis most likely leads to a program crash.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-7899741038104017237?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/7899741038104017237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=7899741038104017237' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/7899741038104017237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/7899741038104017237'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/05/64-bit-beatunes-beta-for-snow-leopard.html' title='64 bit beaTunes Beta for Snow Leopard'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-568698404465147497</id><published>2009-05-27T11:08:00.004-05:00</published><updated>2009-05-27T11:45:50.800-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Harmonic Mixing'/><category scheme='http://www.blogger.com/atom/ns#' term='Key'/><category scheme='http://www.blogger.com/atom/ns#' term='Release'/><title type='text'>beaTunes 2.0.8</title><content type='html'>&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo"&gt;&lt;/a&gt;&lt;a href="http://www.beatunes.com"&gt;beaTunes 2.0.8&lt;/a&gt; is out. Here's the short list of changes:&lt;/p&gt;&lt;p&gt;&lt;ul&gt;&lt;li&gt;Fixed 'Analyze/Inspect New Songs'&lt;/li&gt;&lt;li&gt;Amazon requests are now signed&lt;/li&gt;&lt;li&gt;Deleted tracks are now moved to trash/recycling bin, if possible&lt;/li&gt;&lt;li&gt;Switched key notation to flats&lt;/li&gt;&lt;li&gt;Added clock hand to key&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;I'd like to give a little bit more detail about the last three items.&lt;/p&gt;&lt;p&gt;Before 2.0.8, deleted tracks were only removed from the iTunes database, but the actual files remained on the harddrive. 2.0.8 changes this - files are now deleted (or put in the trash/recycling bin). For more info on this and on how to delete files of duplicates that you removed with pre 2.0.8, see &lt;a href="http://www.beatunes.com/news/2009/05/deleting-orphaned-files.html"&gt;this posting&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The key notation was switched from sharps to flats, because many users using the &lt;a href="http://www.harmonic-mixing.com/HowTo.aspx"&gt;Camelot wheel&lt;/a&gt; find it easier to refer to keys in this notation. Because the company that came up with the wheel, regards the number code their intellectual property, we can't simply display that number. But to make things a little easier, I added a little clock hand to the key color. This hand points in the same direction in which the key would be located on the Camelot wheel, thus making it easier to figure out what keys match harmonically.&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/keys-771441.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 188px;" src="http://www.beatunes.com/news/uploaded_images/keys-771439.png" border="0" alt="keys with clock hands" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Much of these enhancements are based on user input (Thank you!) - I really hope this improves the quality and usefulness of the software for harmonic mixing.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-568698404465147497?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/568698404465147497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=568698404465147497' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/568698404465147497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/568698404465147497'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/05/beatunes-208.html' title='beaTunes 2.0.8'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-617671816593036678</id><published>2009-05-27T10:46:00.002-05:00</published><updated>2009-05-27T11:07:23.193-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><title type='text'>Deleting orphaned Files</title><content type='html'>&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo"&gt;&lt;/a&gt;As most of you know, &lt;a href="http://www.beatunes.com"&gt;beaTunes has the ability to find and delete duplicates&lt;/a&gt;. Up to version 2.0.7, these duplicates were only deleted from the iTunes database, but the actual files were not removed. I changed this in 2.0.8 - whenever possible, files are now moved to the trash/recycling bin or are simply deleted, should trash or recycling bin not be available (e.g. on network drives). But if you have deleted duplicates with an old version of beaTunes, it might be difficult to identify the files that are not referenced by iTunes anymore.&lt;/p&gt;&lt;p&gt;To solve the dilemma, I wrote a little plugin, that compares the iTunes database with all the files in a folder, i.e. the music folder where you keep your mp3's etc. in.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Note that this only makes sense, when you let iTunes manage your music collection or all your music files are in one folder that contains nothing but those files!&lt;/em&gt;&lt;/p&gt;&lt;p&gt;To install the plugin, download &lt;a href="http://www.beatunes.com/download/deleteorphans-1.0.0.jar"&gt;deleteorphans-1.0.0.jar&lt;/a&gt; and place it in your plugin folder (see &lt;a href="http://www.beatunes.com/news/2008/12/copy-keys-to-grouping-plugin.html"&gt;this posting&lt;/a&gt; to find out where that is). The next time you start beaTunes, there will be an additional entry in your &lt;em&gt;Tools&lt;/em&gt; menu called &lt;em&gt;Delete orphans&lt;/em&gt;. Click on it and enter the location of your music folder, which is usually called &lt;em&gt;iTunes Music&lt;/em&gt;. This folder should contain nothing but your audio/video files!&lt;/p&gt;&lt;p&gt;The plugin now compares the iTunes library with the contents of that folder and presents a list of files it found in the folder (or its subfolders), but not in iTunes. Review the list carefully and make sure you only select those files that you actually want to delete, then delete them.&lt;/p&gt;&lt;p&gt;For those of you interested in how the plugin works, take a look at the &lt;a href="http://www.beatunes.com/download/deleteorphans-1.0.0-project.zip"&gt;sources&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-617671816593036678?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/617671816593036678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=617671816593036678' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/617671816593036678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/617671816593036678'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/05/deleting-orphaned-files.html' title='Deleting orphaned Files'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-5529951164984647730</id><published>2009-05-25T20:11:00.003-05:00</published><updated>2009-05-25T20:13:38.910-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Release'/><title type='text'>beaTunes 1.2.19 update</title><content type='html'>&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo"&gt;&lt;/a&gt;For all of you who still run beaTunes 1.2 - there is a minor update &lt;a href="http://www.beatunes.com/beatunes-download-old.html"&gt;right here&lt;/a&gt;. The update offers nothing substantially new, but will make sure that the built-in Amazon related functionalities continue to work in the future.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-5529951164984647730?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/5529951164984647730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=5529951164984647730' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/5529951164984647730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/5529951164984647730'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/05/beatunes-1219-update.html' title='beaTunes 1.2.19 update'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-2236368879792302433</id><published>2009-05-21T12:14:00.003-05:00</published><updated>2009-05-21T12:26:14.036-05:00</updated><title type='text'>Moving files to the Windows Recycling Bin in Java</title><content type='html'>&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo"&gt;&lt;/a&gt;This is a little random and has little to do with beaTunes. However, I thought I share...&lt;/p&gt;&lt;p&gt;As you may know, there is no way to move files to the Windows Recycling Bin in Java (instead of simply deleting them). It is however actually not very hard. All you need to do, is get a reference to a Shell object and use it to move your file. Now how do you get that Shell object? The easiest way is probably &lt;a href="https://com4j.dev.java.net/"&gt;COM4J&lt;/a&gt;. The shell32 typelib id is &lt;code&gt;50a7e9b0-70ef-11d1-b75a-00a0c90564fe&lt;/code&gt;. Use it to generate some stubs. Then you simply write something like this:&lt;/p&gt;&lt;p&gt;&lt;pre&gt;final IShellDispatch shell = ClassFactory.createShell();&lt;br /&gt;// you might want to make sure your parent path has back slashes!&lt;br /&gt;final Folder fileFolder = shell.nameSpace(file.getParent());&lt;br /&gt;final FolderItem fileItem = fileFolder.parseName(file.getName());&lt;br /&gt;final Folder folder = shell.nameSpace(ShellSpecialFolderConstants.ssfBITBUCKET);&lt;br /&gt;folder.moveHere(fileItem, null);&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;This assumes that &lt;code&gt;file&lt;/code&gt; is the file you want to move to the trash.&lt;/p&gt;&lt;p&gt;That's it.&lt;/p&gt;&lt;p&gt;BTW: On OS X you can simply call AppleScript with something like &lt;code&gt;tell application "Finder" to delete Posix File "&amp;lt;your filename here&amp;gt;"&lt;/code&gt; - it'll move your file to the trash.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-2236368879792302433?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/2236368879792302433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=2236368879792302433' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/2236368879792302433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/2236368879792302433'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/05/moving-files-to-windows-recycling-bin.html' title='Moving files to the Windows Recycling Bin in Java'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-8763388111928774083</id><published>2009-05-18T14:58:00.004-05:00</published><updated>2009-05-18T15:03:09.795-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='ReplayGain'/><title type='text'>Enjoy DSP coding? Heard of Replay Gain?</title><content type='html'>&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo"&gt;&lt;/a&gt;Have you ever done any DSP coding? Well, if you have and you think you'd enjoy some DSP Java coding, let me know. I'm interested in adding a &lt;a href="http://www.replaygain.org/"&gt;Replay Gain&lt;/a&gt; implementation to beaTunes and am looking for someone to code it up for me...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-8763388111928774083?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/8763388111928774083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=8763388111928774083' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/8763388111928774083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/8763388111928774083'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/05/enjoy-dsp-coding-heard-of-replay-gain.html' title='Enjoy DSP coding? Heard of Replay Gain?'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-2154695387119697368</id><published>2009-05-14T09:23:00.003-05:00</published><updated>2009-05-14T09:32:39.925-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Release'/><title type='text'>Parlez-vous français ?</title><content type='html'>&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo"&gt;&lt;/a&gt;Well, do you speak French? If so, good for you. Because &lt;a href="http://www.beatunes.com/"&gt;beaTunes is now available in French&lt;/a&gt;. That's right a French localization. Thanks to Ronald Armand Leroux, beaTunes 2.0.7 now has a French user interface on French computers.&lt;/p&gt;&lt;p&gt;Viva la France!&lt;/p&gt;&lt;p&gt;...and Canada, of course,&lt;/p&gt;&lt;p&gt;...and parts of Belgium,&lt;/p&gt;&lt;p&gt;...and, well you get the idea :-)&lt;/p&gt;&lt;p&gt;(and in case you didn't know, beaTunes also has a built-in German localization)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-2154695387119697368?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/2154695387119697368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=2154695387119697368' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/2154695387119697368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/2154695387119697368'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/05/parlez-vous-francais.html' title='Parlez-vous français ?'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-166043518689169659</id><published>2009-05-06T14:26:00.003-05:00</published><updated>2009-05-06T14:29:16.052-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Release'/><title type='text'>beaTunes 2.0.6</title><content type='html'>&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo"&gt;&lt;/a&gt;I just released &lt;a href="http://www.beatunes.com"&gt;beaTunes 2.0.6&lt;/a&gt; - it contains mostly bug fixes. The most important one affects the missing file inspection - in some cases the entries were actually not deleted, but beaTunes didn't even show an error message. For info about other changes, please see NOTES.txt in the release.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-166043518689169659?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/166043518689169659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=166043518689169659' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/166043518689169659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/166043518689169659'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/05/beatunes-206.html' title='beaTunes 2.0.6'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-4227569157499021347</id><published>2009-04-08T12:04:00.003-05:00</published><updated>2009-04-08T12:12:28.909-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inspection'/><category scheme='http://www.blogger.com/atom/ns#' term='Release'/><title type='text'>Address those issues! At once!</title><content type='html'>&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo"&gt;&lt;/a&gt;Today I released &lt;a href="http://www.beatunes.com"&gt;beaTunes 2.0.5&lt;/a&gt;. The update is minor one and serves mostly to make some UI deadlocks a thing of the past. Unresponsive UIs are a PITA and give apps a bad rep, so I wanted to address this one quickly.&lt;/p&gt;&lt;p&gt;The other thing that's changed is a new feature. At least for some issues you can now apply solutions that are suitable for multiple issues at once. So if you know what you are doing, you can apply solutions to more files more quickly. A lot more quickly. So be careful when using this one... it gives you less information, but more power.&lt;/p&gt;&lt;p&gt;To apply multiple solutions at once, select either an inspection or multiple issues and in the description pane on the right of the inspection dialog solutions will be offered.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-4227569157499021347?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/4227569157499021347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=4227569157499021347' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/4227569157499021347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/4227569157499021347'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/04/address-those-issues-at-once.html' title='Address those issues! At once!'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-1321749383870164414</id><published>2009-04-02T14:21:00.003-05:00</published><updated>2009-04-02T14:29:13.532-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inspection'/><title type='text'>iTunes, Exclamation Mark!</title><content type='html'>&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo"&gt;&lt;/a&gt;Many of you probably know, that beaTunes has the capability to find those songs that &lt;a href="http://www.beatunes.com/itunes-exclamation-mark.html"&gt;iTunes marks with an exclamation mark&lt;/a&gt; to indicate that it was unable to find the corresponding file. It's called &lt;i&gt;Missing File Inspection&lt;/i&gt;.&lt;/p&gt;&lt;p&gt;It was recently brought to my attention, that there is another way to find at least &lt;i&gt;some&lt;/i&gt; of the missing tracks: Just sort by &lt;i&gt;location&lt;/i&gt; in beaTunes. All songs that iTunes does not even know the old filename for will show up as &lt;i&gt;unkown&lt;/i&gt;.&lt;/p&gt;&lt;p&gt;Eine deutsche Beschreibung der Inspektion befindet sich zudem auf der Seite &lt;a href="http://www.beatunes.com/itunes-ausrufezeichen.html"&gt;iTunes Ausrufezeichen&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-1321749383870164414?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/1321749383870164414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=1321749383870164414' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/1321749383870164414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/1321749383870164414'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/04/itunes-exclamation-mark.html' title='iTunes, Exclamation Mark!'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-3942503354964470563</id><published>2009-04-02T10:39:00.005-05:00</published><updated>2009-04-15T04:31:17.162-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Key'/><category scheme='http://www.blogger.com/atom/ns#' term='Wikipedia'/><title type='text'>Who will create a Wikipedia entry about beaTunes?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo"&gt;&lt;/a&gt;&lt;p&gt;Are you a contributor to &lt;a href="http://en.wikipedia.org/"&gt;Wikipedia&lt;/a&gt;? If so, I would really appreciate it, if you created a page about beaTunes and made sure it is linked to the &lt;a href="http://en.wikipedia.org/wiki/Harmonic_mixing"&gt;Harmonic Mixing&lt;/a&gt;, the &lt;a href="http://en.wikipedia.org/wiki/Beatmixing"&gt; Beatmixing&lt;/a&gt; and the &lt;a href="http://en.wikipedia.org/wiki/Itunes"&gt;iTunes&lt;/a&gt; page.&lt;/p&gt;&lt;p&gt;Here's why:&lt;/p&gt;&lt;p&gt;Briefly after the launch of &lt;a href="http://www.beatunes.com/"&gt;beaTunes 2&lt;/a&gt;, I went ahead and added a half sentence about beaTunes to the &lt;a href="http://en.wikipedia.org/wiki/Harmonic_mixing"&gt;Harmonic Mixing page on Wikipedia&lt;/a&gt;. I had noticed that the page lists most of the available key detection software that's out there, and since beaTunes 2 with its new key detection feature is now one of them, I figured that needs to be added. Now, for lots of good reasons, Wikipedia is really big on &lt;a href="http://en.wikipedia.org/wiki/Wikipedia:COI"&gt;conflict of interest (COI)&lt;/a&gt;, which is why I kept my edits to a bare, factual minimum.&lt;/p&gt;&lt;p&gt;To a list of key detection software I added the statement:&lt;/p&gt;&lt;p&gt;&lt;blockquote&gt;the same can also be achieved with [[beaTunes]] by [[tagtraum industries]].&lt;/blockquote&gt;&lt;/p&gt;&lt;p&gt;Additionally, I added a link to the beaTunes site in the link section of the page.&lt;/p&gt;&lt;p&gt;And to make sure that whoever reviews my edits knows that I am affiliated with beaTunes, I wrote just that in the comment section of my edit.&lt;/p&gt;&lt;p&gt;I figured, that by declaring my COI, somebody else would look at the edit, realize that it is factually right, desirable and a valuable addition to the page - and therefore worth keeping.&lt;/p&gt;&lt;p&gt;So far I was wrong. Somebody did look at it, but simply removed it, stating COI - apparently without considering the content of my edits.&lt;/p&gt;&lt;p&gt;I contacted the person and we'll see what happens.&lt;/p&gt;&lt;p&gt;In any case. I believe that beaTunes should be mentioned in Wikipedia, but obviously can't do it myself. If you are reading this, you are most likely a beaTunes user, an expert so to say. Why don't you create a beaTunes page on Wikipedia? And enhance the Harmonic Mixing page? Or any other page, that you think would benefit from mentioning beaTunes?&lt;/p&gt;&lt;p&gt;And to be clear: I am an avid Wikipedia user myself and value it quite a bit (even wrote a little &lt;a href="http://www.beatunes.com/news/2009/02/creating-your-own-song-context.html"&gt;Wikipedia beaTunes plugin&lt;/a&gt; for it). Please stay factual. Don't write anything that could be seen as promotion, adhere to the guidelines. Contact me, if you need any additional information for your article.&lt;/p&gt;&lt;p&gt;Thanks!&lt;/p&gt;&lt;p&gt;&lt;em&gt;Update 4/15/2009&lt;/em&gt;: Looks like somebody created an English beaTunes page on &lt;a href="http://en.wikipedia.org/wiki/BeaTunes"&gt;Wikipedia&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Thanks!&lt;/p&gt;&lt;p&gt;Now only the link in Harmonic Mixing is still missing and of course a German entry... :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-3942503354964470563?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/3942503354964470563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=3942503354964470563' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/3942503354964470563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/3942503354964470563'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/04/who-will-create-wikipedia-entry-about.html' title='Who will create a Wikipedia entry about beaTunes?'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-8284032107643412415</id><published>2009-03-27T17:04:00.002-05:00</published><updated>2009-03-27T17:08:30.699-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Key'/><category scheme='http://www.blogger.com/atom/ns#' term='Plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><title type='text'>Key to Comment</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo"&gt;&lt;/a&gt;&lt;p&gt;Want to copy your musical keys to the comment field? Check out this &lt;a href="http://www.beatunes.com/download/keytocomment-1.0.2.jar"&gt;plugin&lt;/a&gt; (&lt;a href="http://www.beatunes.com/download/keytocomment-1.0.2-project.zip"&gt;sources&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;(installation instructions are the same as for &lt;a href="http://www.beatunes.com/news/2008/12/copy-keys-to-grouping-plugin.html"&gt;keytogrouping&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;Enjoy!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-8284032107643412415?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/8284032107643412415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=8284032107643412415' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/8284032107643412415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/8284032107643412415'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/03/key-to-comment.html' title='Key to Comment'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-303341868071882709</id><published>2009-03-27T16:45:00.002-05:00</published><updated>2009-03-27T16:53:23.530-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Key'/><category scheme='http://www.blogger.com/atom/ns#' term='Plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><title type='text'>Updated Key to Grouping plugin</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo"&gt;&lt;/a&gt;&lt;p&gt;A while ago, before the beaTunes 2 release, I posted about how to &lt;a href="http://www.beatunes.com/news/2008/12/copy-keys-to-grouping-plugin.html"&gt;develop a simple analysis task plugin&lt;/a&gt;. Because this plugin broke a while ago, I decided to go ahead and update the old post with a new version of the same plugin. Which isn't really news.&lt;/p&gt;&lt;p&gt;But!&lt;/p&gt;&lt;p&gt;I also updated the &lt;code&gt;pom.xml&lt;/code&gt; of the &lt;a href="http://www.beatunes.com/download/keytogrouping-1.0.2-project.zip"&gt;project&lt;/a&gt; so that it actually compiles from the command line, i.e. with &lt;code&gt;mvn clean install&lt;/code&gt;. Of course you need &lt;a href="http://maven.apache.org/"&gt;Maven2&lt;/a&gt; installed, but everything else is automatic.&lt;/p&gt;&lt;p&gt;This is possible, because I decided to upload the beaTunes binaries to our own little repository. It should simplify plugin development significantly.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-303341868071882709?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/303341868071882709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=303341868071882709' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/303341868071882709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/303341868071882709'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/03/updated-key-to-grouping-plugin.html' title='Updated Key to Grouping plugin'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-8374707891783941541</id><published>2009-03-24T17:08:00.007-05:00</published><updated>2009-04-01T07:38:47.053-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppJacked'/><category scheme='http://www.blogger.com/atom/ns#' term='Crash'/><title type='text'>Hear plugin crashes beaTunes</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo"&gt;&lt;/a&gt;&lt;p&gt;The new CrashReporter built into the latest beaTunes versions already provides valuable info. It looks like a number of users experience crashes that might have to do with &lt;a href="http://www.joesoft.com/products/hear.php"&gt;Hear&lt;/a&gt;.  If you see a couple of lines like these in your crashlog,&lt;/p&gt;&lt;p&gt;&lt;pre&gt;Thread 23 Crashed:&lt;br /&gt;0   com.joesoft.hal                0x0e36eced osp_plugin::osp_plugin() + 13&lt;br /&gt;1   com.joesoft.hal                0x0e377d2d std::vector&amp;lt;std::basic_string&amp;lt;char, std::char_traits&amp;lt;char&gt;, std::allocator&amp;lt;char&gt; &gt;, &lt;/pre&gt;&lt;/p&gt;&lt;p&gt;it's possible that the crash was caused by a plugin in &lt;code&gt;/Library/Audio/Plug-Ins/HAL&lt;/code&gt;. Users have told me it might be the &lt;code&gt;Hear.plugin&lt;/code&gt;. Removing the plugin probably solves the problem. I have not been able to verify this myself yet, but would appreciate some feedback.&lt;/p&gt;&lt;p&gt;Thanks!&lt;/p&gt;&lt;p&gt;(Apparently we are not the only ones fighting this stuff: &lt;a href="http://bitcartel.blogspot.com/2008/08/appjacked-2.html"&gt;AppJacked 2&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;&lt;i&gt;Update:&lt;/i&gt;Looks very much like Hear is the culprit. The telltale sign is very high memory consumption. Note that its not enough to simply drag the Hear application to the trash. To actually remove the plugin, follow the &lt;a href="http://www.joesoft.com/products/hear_faq.php?faq=390"&gt;uninstall directions&lt;/a&gt;. You have to run Hear to call &lt;i&gt;Uninstall&lt;/i&gt; from its application menu. Alternatively, you can simply remove the file &lt;code&gt;/Library/Audio/Plug-Ins/HAL/Hear.plugin&lt;/code&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-8374707891783941541?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/8374707891783941541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=8374707891783941541' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/8374707891783941541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/8374707891783941541'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/03/hear-plugin-crashes-beatunes.html' title='Hear plugin crashes beaTunes'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-3803525033446609528</id><published>2009-03-23T12:36:00.002-05:00</published><updated>2009-03-23T12:46:30.176-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Release'/><title type='text'>beaTunes 2.0.3</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo"&gt;&lt;/a&gt;&lt;p&gt;Things have been busy, which is why there hasn't really been a lot of news lately - posted news that is. Today I released &lt;a href="http://www.beatunes.com"&gt;beaTunes 2.0.3&lt;/a&gt;. It's a pure bugfix release that rids us from a number of small annoyances and a couple of real bugs.&lt;/p&gt;&lt;p&gt;The location of new MatchLists and playlists will now be a whole lot more predictable, the percentage slider in the silence detection config will actually be honored, scrolling through playlists should be smoother, etc.&lt;/p&gt;&lt;p&gt;The only new feature (if you want to call it that), is the capability to report crashes to my server. When you restart beaTunes after a crash, it should now offer to send the logs to the server. This includes stuff you did with beaTunes, your system info, your registration info etc. The dialog that pops up will mention the name of the file that's sent, so you can verify yourself that I am not trying to get your bank account numbers. And then of course you can simply choose not to send it.&lt;/p&gt;&lt;p&gt;I really hope this will make it easier to collect data from users in order to fix bugs quicker.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-3803525033446609528?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/3803525033446609528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=3803525033446609528' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/3803525033446609528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/3803525033446609528'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/03/beatunes-203.html' title='beaTunes 2.0.3'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-95058019188200737</id><published>2009-02-24T23:53:00.005-05:00</published><updated>2009-02-25T00:20:52.050-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Early Access'/><category scheme='http://www.blogger.com/atom/ns#' term='Release'/><title type='text'>Just released: beaTunes 2.0.0b</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo"&gt;&lt;/a&gt;&lt;p&gt;It's been a busy day, here at &lt;i&gt;tagtraum industries&lt;/i&gt;. I finally got around releasing &lt;a href="http://www.beatunes.com/"&gt;beaTunes 2&lt;/a&gt;, and of course this kind of thing never goes smoothly. Even though there were so many Early Access releases and I got so much valuable feedback from early testers, some things still go wrong.&lt;/p&gt;&lt;p&gt;It wasn't anything major, but right after the initial release, I did some sanity testing to make 200% sure that things work the way they should... and they didn't. Minor things. And then one of those early adopters contacted me and made me aware of another issue. And then there was another issue. Anyhow. All those issues are now fixed and I uploaded version 2.0.0b to the server.&lt;/p&gt;&lt;p&gt;Now, because these were quick and easy fixes, the 2.0.0b release will still claim that it is a 2.0.0 release. And there is no way that you can tell the difference, except for the version number of the disk image file or the Windows installer executable. So if you just installed beaTunes 2, please make sure you have the latest version by checking the version number of your installation file.&lt;/p&gt;&lt;p&gt;To make folks aware of this, the built-in update checker will claim that there is a new version out there - regardless of whether you have the latest version or not. I know, this is a little misleading and looks like a bug, but I rather have people download the newest and shiniest beaTunes once too often, than have them stumbling over bugs that are already fixed. I hope you understand.&lt;/p&gt;&lt;p&gt;Now, that said: beaTunes 2 is a huge step forward.&lt;/p&gt;&lt;p&gt;The short list of what's new:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Completely rewritten internal database&lt;/li&gt;&lt;li&gt;Much better support for huge libraries&lt;/li&gt;&lt;li&gt;Ability to recognize multiple libraries&lt;/li&gt;&lt;li&gt;Analysis on Windows is much faster&lt;/li&gt;&lt;li&gt;Tonal/musical key detection&lt;/li&gt;&lt;li&gt;Second BPM detection algorithm&lt;/li&gt;&lt;li&gt;New inspections (compilation, duplicates, rare genres, different ratings, sort issues, Amazon album version)&lt;/li&gt;&lt;li&gt;More accurate typo inspections&lt;/li&gt;&lt;li&gt;Support for sort names&lt;/li&gt;&lt;li&gt;Ability to specify filters when creating Matchlists&lt;/li&gt;&lt;li&gt;Matchlists can now be refreshed&lt;/li&gt;&lt;li&gt;Ability to embed non-iTunes fields into audio files&lt;/li&gt;&lt;li&gt;Search by artist/album/etc.&lt;/li&gt;&lt;li&gt;German localization&lt;/li&gt;&lt;li&gt;Updated UI (on OS X, check out that Leopard theme!)&lt;/li&gt;&lt;li&gt;Overall usability improvements&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This is the first update in 2.5 years that I am going to charge for. This means, that if you own a beaTunes 1.x license, you can &lt;a href="http://www.beatunes.com/beatunes-buy.html"&gt;purchase the upgrade for $11.95 (USD)&lt;/a&gt; [as of 2/24/2009].&lt;/p&gt;&lt;p&gt;If you have bought your beaTunes 1.x license after 2/1/2009, you should already have received a free upgrade license.&lt;/p&gt;&lt;p&gt;Thanks again to all the people who helped to make this happen for their continued support. This includes all the testers, customers, friends and open source software authors, without whom beaTunes would not be possible.&lt;/p&gt;&lt;p&gt;I hope you enjoy my software.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-95058019188200737?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/95058019188200737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=95058019188200737' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/95058019188200737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/95058019188200737'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/02/just-released-beatunes-200b.html' title='Just released: beaTunes 2.0.0b'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-9194149962941968602</id><published>2009-02-21T17:29:00.011-05:00</published><updated>2009-04-02T11:10:40.835-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OS X'/><category scheme='http://www.blogger.com/atom/ns#' term='Plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Wikipedia'/><category scheme='http://www.blogger.com/atom/ns#' term='Early Access'/><title type='text'>Creating your own Song Context Components</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo" /&gt;&lt;/a&gt;&lt;p&gt;As a &lt;a href="http://www.beatunes.com"&gt;beaTunes&lt;/a&gt; user you know that the matching song table and the Amazon song info panel are integral parts of the application. Both are hosted in the same space, right below the main song table. beaTunes'  new plugin API makes it simple to write additional, custom components for the same space. I'd like to show you with a simple example how it's done.&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/wikipedia_screenshot-761914.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 269px;" src="http://www.beatunes.com/news/uploaded_images/wikipedia_screenshot-761766.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;p&gt;The idea of this plugin is to show the &lt;a href="http://en.wikipedia.org/"&gt;Wikipedia&lt;/a&gt; page corresponding to the selected song's artist. Because Java's JEditorPane has a rather poor HTML rendering performance and &lt;a href="http://weblogs.java.net/blog/ixmal/archive/2008/05/introducing_jwe.html"&gt;JWebPane&lt;/a&gt; is definitely not available on the Mac, we will use &lt;a href="https://jdic.dev.java.net/"&gt;JDIC&lt;/a&gt; as browser component (this example will only run on OS X, the concept is the same though for Windows). Note, that the &lt;a href="https://jdic.dev.java.net/files/documents/880/43611/jdic-20061102-bin-mac.zip"&gt;Mac version of JDIC&lt;/a&gt; is rather old and really only an alpha version. So expect unnecessary repaints and other visual artifacts. But this is not about the perfect embedded browser for Java, it's about custom &lt;code&gt;SongContextComponents&lt;/code&gt;.&lt;/p&gt;&lt;h3&gt;Subclassing SongContextComponent&lt;/h3&gt;&lt;p&gt;Our Wikipedia component has to subclass &lt;code&gt;com.tagtraum.beatunes.songtable.SongContextComponent&lt;/code&gt;. This superclass does most of the work for us. We only have to implement a couple of methods. Let's start with the simple stuff. Just like any other well behaved plugin, our component should have an id.&lt;/p&gt;&lt;pre&gt;public String getId() {&lt;br /&gt;    return "songcontextcomponent.wikipedia";&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;Furthermore, it needs to specify a status label text, which for our purposes may always remain empty (future versions of the API won't require this anymore).&lt;/p&gt;&lt;pre&gt;public String getStatusLabel() {&lt;br /&gt;    return null;&lt;br /&gt;}&lt;/pre&gt;&lt;h3&gt;Setting up the UI&lt;/h3&gt;&lt;p&gt;To set up the component itself, we have to declare a couple of fields and instantiate the UI component in the constructor. Also, as part of the interface, we have to implement the &lt;code&gt;getComponent()&lt;/code&gt; method, which returns the &lt;code&gt;JComponent&lt;/code&gt; that is going to be integrated into beaTunes' UI. Here's how it's done:&lt;/p&gt;&lt;pre&gt;private static final Logger LOG = LogManager.getLogger(Wikipedia.class);&lt;br /&gt;&lt;br /&gt;// the component we hand to beaTunes&lt;br /&gt;private JPanel component;&lt;br /&gt;// the actual browser component&lt;br /&gt;private IWebBrowser webBrowser;&lt;br /&gt;// we want to remember the last artist we've shown&lt;br /&gt;// to avoid reloading the same page&lt;br /&gt;private String lastArtist;&lt;br /&gt;// page loading should be done in a separate thread, not the event thread&lt;br /&gt;private ExecutorService executorService;&lt;br /&gt;// loading will be done in a Future, which can be cancelled&lt;br /&gt;private Future&lt;?&gt; future;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public Wikipedia(final BeaTunes beaTunes) {&lt;br /&gt;    super(beaTunes);&lt;br /&gt;    // register the show hide action for this SongContextComponent&lt;br /&gt;    setShowHideActionId("wikipedia.show.hide");&lt;br /&gt;    this.executorService = Executors.newSingleThreadExecutor(&lt;br /&gt;        PriorityThreadFactory.getInstance(Thread.MIN_PRIORITY));&lt;br /&gt;    this.webBrowser = BrowserEngineManager.instance().getActiveEngine().getWebBrowser();&lt;br /&gt;    // webBrowser already has scrollbars, therefore a JPanel is good enough as component&lt;br /&gt;    this.component = new JPanel(new BorderLayout());&lt;br /&gt;    this.component.add((Component) webBrowser, BorderLayout.CENTER);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public JComponent getComponent() {&lt;br /&gt;    return component;&lt;br /&gt;}&lt;/pre&gt;&lt;h3&gt;Reacting to song selections&lt;/h3&gt;&lt;p&gt;Now that we have set up the &lt;code&gt;webBrowser&lt;/code&gt; component, the only thing that's left to do, is to put some content into the browser window. To do so, we implement the &lt;code&gt;update(Song)&lt;/code&gt; method. This method is called when the user selects a song in the main song table. To be precise, it is not called right away when the user selects a song, but with a little delay. This allows us to ignore the selection, should the user just scroll down a list of songs using the cursor keys.&lt;/p&gt;&lt;pre&gt;public void update(final Song song) {&lt;br /&gt;    // sanity checks&lt;br /&gt;    if (song == null) return;&lt;br /&gt;    if (song.getArtist() == null || song.getArtist().length() == 0) return;&lt;br /&gt;    final String artist = song.getAlbumArtist() != null&lt;br /&gt;            &amp;&amp; song.getAlbumArtist().length() != 0&lt;br /&gt;            ? song.getAlbumArtist() : song.getArtist();&lt;br /&gt;    // is this what we just showed?&lt;br /&gt;    if (artist.equals(lastArtist)) return;&lt;br /&gt;    lastArtist = artist;&lt;br /&gt;    showArtist(artist);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private void showArtist(final String artist) {&lt;br /&gt;    if (future != null) {&lt;br /&gt;        future.cancel(true);&lt;br /&gt;    }&lt;br /&gt;    future = executorService.submit(new Runnable() {&lt;br /&gt;        public void run() {&lt;br /&gt;            try {&lt;br /&gt;                // respect the user's language&lt;br /&gt;                final String language = getApplication().getLocale().getLanguage();&lt;br /&gt;                final URL url = new URL("http://" + language&lt;br /&gt;                        + ".wikipedia.org/wiki/Special:Search?search="&lt;br /&gt;                        + URLEncoder.encode(artist, "UTF-8") + "&amp;go=Go");&lt;br /&gt;                webBrowser.setURL(url);&lt;br /&gt;            } catch (IOException e) {&lt;br /&gt;               LOG.error("Unable to open page for " + artist, e);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    });&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;That's basically it.&lt;/p&gt;&lt;h3&gt;Showing some Action&lt;/h3&gt;&lt;p&gt;Well, almost... there are some things we still need to take care of. To start with, we of course have to provide a &lt;code&gt;plugin.xml&lt;/code&gt; file to register the class. But more importantly, we have to provide some Action to show and hide our Wikipedia component. To do so, we subclass &lt;code&gt;com.tagtraum.beatunes.action.standard.SongContextComponentShowHideAction&lt;/code&gt;. Here's the class:&lt;/p&gt;&lt;pre&gt;public class ShowHideWikipediaAction extends SongContextComponentShowHideAction {&lt;br /&gt;&lt;br /&gt;    public ShowHideWikipediaAction(final BeaTunes beaTunes) {&lt;br /&gt;        super(beaTunes);&lt;br /&gt;        putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_W,&lt;br /&gt;                Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()&lt;br /&gt;                | InputEvent.SHIFT_MASK));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void init() {&lt;br /&gt;        // always call super.init() to make sure the action gets enabled/disabled properly&lt;br /&gt;        super.init();&lt;br /&gt;        putValue(Action.NAME, "Show Artist Info");&lt;br /&gt;        putValue(Action.SHORT_DESCRIPTION, "Shows artist info on Wikipedia");&lt;br /&gt;        putValue(Action.SMALL_ICON,&lt;br /&gt;            new ImageIcon(Wikipedia.class.getResource("wikipedia.png")));&lt;br /&gt;        putValue(BaseAction.SELECTED_ICON,&lt;br /&gt;            new ImageIcon(Wikipedia.class.getResource("wikipedia_selected.png")));&lt;br /&gt;        putValue(BaseAction.DISABLED_ICON,&lt;br /&gt;            new ImageIcon(Wikipedia.class.getResource("wikipedia_disabled.png")));&lt;br /&gt;        putValue(BaseAction.DISABLED_SELECTED_ICON,&lt;br /&gt;            new ImageIcon(Wikipedia.class.getResource("wikipedia_disabled.png")));&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String getId() {&lt;br /&gt;        // this is the id we reference in the Wikipedia class&lt;br /&gt;        return "wikipedia.show.hide";&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public ActionLocation[] getActionLocations() {&lt;br /&gt;        return new ActionLocation[] {&lt;br /&gt;                // add to Edit menu&lt;br /&gt;                new RelativeActionLocation(BeaTunesUIRegion.EDIT_MENU,&lt;br /&gt;                    RelativeActionLocation.RelativePosition.BEFORE, "tree.show.hide"),&lt;br /&gt;                // add as first (index 0) item to the lower right button panel&lt;br /&gt;                new AbsoluteActionLocation(BeaTunesUIRegion.LOWER_RIGHT_BUTTON_PANEL, 0)&lt;br /&gt;        };&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;And here is the very simple &lt;code&gt;plugin.xml&lt;/code&gt; that needs to be placed in the &lt;code&gt;META-INF&lt;/code&gt; directory of our jar.&lt;/p&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" ?&amp;gt;&lt;br /&gt;&amp;lt;!-- Contains a list of plugins to be instantiated by beaTunes --&amp;gt;&lt;br /&gt;&amp;lt;plugins&amp;gt;&lt;br /&gt;    &amp;lt;!-- SongContextComponent --&amp;gt;&lt;br /&gt;    &amp;lt;plugin class="com.beatunes.wikipedia.Wikipedia"/&amp;gt;&lt;br /&gt;    &amp;lt;!-- Actions --&amp;gt;&lt;br /&gt;    &amp;lt;plugin class="com.beatunes.wikipedia.ShowHideWikipediaAction"/&amp;gt;&lt;br /&gt;&amp;lt;/plugins&amp;gt;&lt;/pre&gt;&lt;h3&gt;Zip it!&lt;/h3&gt;&lt;p&gt;Since the plugin uses third party libraries, we can't just put everything in one jar and place it in the plugin folder. Instead, we have to create a folder with a subfolder called &lt;code&gt;lib&lt;/code&gt;. Into the &lt;code&gt;lib&lt;/code&gt; folder we place the plugin's jar, &lt;code&gt;jdic.jar&lt;/code&gt; and the native library &lt;code&gt;libjdic.jnilib&lt;/code&gt; (both from &lt;a href="https://jdic.dev.java.net/files/documents/880/43611/jdic-20061102-bin-mac.zip"&gt;JDIC&lt;/a&gt;). Then we zip the whole thing up.&lt;/p&gt;&lt;p&gt;In essence, the directory structure looks like this:&lt;/p&gt;&lt;pre&gt;/lib/wikipedia-1.0.0.jar&lt;br /&gt;    /jdic.jar&lt;br /&gt;    /libjdic.jnilib&lt;/pre&gt;&lt;p&gt;For beaTunes 2, the plugin classloader is configured to add all jars in the &lt;code&gt;lib&lt;/code&gt; directory, and the &lt;code&gt;classes&lt;/code&gt; subdirectory itself, should it exist. Note that plugins are not isolated from each other or from beaTunes, so library and/or class version conflicts are something to stay aware of.&lt;/p&gt;&lt;p&gt;You can download the full source for this example from &lt;a href="http://www.beatunes.com/download/wikipedia-1.0.0-project.zip"&gt;here&lt;/a&gt; and the ready to go binary from &lt;a href="http://www.beatunes.com/download/wikipedia-1.0.0.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-9194149962941968602?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/9194149962941968602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=9194149962941968602' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/9194149962941968602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/9194149962941968602'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/02/creating-your-own-song-context.html' title='Creating your own Song Context Components'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-1289956478453212960</id><published>2009-02-11T16:10:00.004-05:00</published><updated>2009-02-11T16:20:20.950-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inspection'/><category scheme='http://www.blogger.com/atom/ns#' term='Early Access'/><title type='text'>Deutsch!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo" /&gt;&lt;/a&gt;&lt;p&gt;So... all the little UI glitches in the last couple of releases hopefully paid off with this one, EA19. All strings are extracted and a German and English set are provided. That means, German users should now be able to enjoy &lt;a href="http://www.beatunes.com/"&gt;beaTunes&lt;/a&gt; in their native tongue! Please let me know, if you find any messages or dialogs that I missed or that sound awkward.&lt;/p&gt;&lt;p&gt;Besides the German localization, this release features a new Compilation Inspector that finds albums that really shouldn't be marked as compilations, some UI fixes and some caching improvements.&lt;/p&gt;&lt;p&gt;And here's the obligatory warning: Before downloading and installing this, please make sure you understand what Early Access means:&lt;ul&gt;&lt;li&gt;Absolutely no warranty for whatever&lt;/li&gt;&lt;li&gt;Features may or may not work, appear, and disappear&lt;/li&gt;&lt;li&gt;It may not be possible to migrate data to future versions (even though I make a reasonable effort)&lt;/li&gt;&lt;li&gt;This version will cease to function 2 weeks after its release&lt;/li&gt;&lt;li&gt;You cannot buy this version&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;Just so that there is no doubt about it: EA19 isn't even a beta version (actually, we are getting really damn close to that, though).&lt;/p&gt;&lt;p&gt;And here are the download links:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.beatunes.com/download/beaTunes-2-0-0-EA19-osx.dmg"&gt;beaTunes-2-0-0-EA19 (OS X)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.beatunes.com/download/beaTunes-2-0-0-EA19-win.exe"&gt;beaTunes-2-0-0-EA19 (Windows)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;h2&gt;Note for EA18 users&lt;/h2&gt;&lt;p&gt;There should be no problems.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-1289956478453212960?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/1289956478453212960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=1289956478453212960' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/1289956478453212960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/1289956478453212960'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/02/deutsch.html' title='Deutsch!'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-327116303542067699</id><published>2009-01-28T06:29:00.003-05:00</published><updated>2009-01-28T06:49:05.211-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Early Access'/><title type='text'>Not much new</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo" /&gt;&lt;/a&gt;&lt;p&gt;EA18 provides some fixes for things that went wrong in EA17 - mainly localization issues, better database lock management, a fixed Vista uninstaller and a couple of other things. Not really much that's new...&lt;/p&gt;&lt;p&gt;And here's the obligatory warning: Before downloading and installing this, please make sure you understand what Early Access means:&lt;ul&gt;&lt;li&gt;Absolutely no warranty for whatever&lt;/li&gt;&lt;li&gt;Features may or may not work, appear, and disappear&lt;/li&gt;&lt;li&gt;It may not be possible to migrate data to future versions (even though I make a reasonable effort)&lt;/li&gt;&lt;li&gt;This version will cease to function 2 weeks after its release&lt;/li&gt;&lt;li&gt;You cannot buy this version&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;Just so that there is no doubt about it: EA18 isn't even a beta version (actually, we are getting really damn close to that, though).&lt;/p&gt;&lt;p&gt;And here are the download links:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.beatunes.com/download/beaTunes-2-0-0-EA18-osx.dmg"&gt;beaTunes-2-0-0-EA18 (OS X)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.beatunes.com/download/beaTunes-2-0-0-EA18-win.exe"&gt;beaTunes-2-0-0-EA18 (Windows)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;h2&gt;Note for EA17 users&lt;/h2&gt;&lt;p&gt;The first time you start beaTunes 2 EA18, a message might pop up, saying that the database appears to be locked. It's safe to &lt;i&gt;not&lt;/i&gt; unlock it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-327116303542067699?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/327116303542067699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=327116303542067699' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/327116303542067699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/327116303542067699'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/01/not-much-new.html' title='Not much new'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-9177214664138391753</id><published>2009-01-14T03:28:00.004-05:00</published><updated>2009-01-14T03:52:09.385-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Early Access'/><title type='text'>Iconic Languages</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.beatunes.com/news/uploaded_images/48-719843.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 48px; height: 48px;" src="http://www.beatunes.com/news/uploaded_images/48-719838.png" border="0" alt="beaTunes2 logo" /&gt;&lt;/a&gt;&lt;p&gt;Oddly enough, EA17 combines some pretty visible and some not so obvious changes. Starting with the obvious:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.beatunes.com/"&gt;beaTunes&lt;/a&gt; has a new icon (designed by Jordan from &lt;a href="http://onetoad.com/"&gt;OneToad Design&lt;/a&gt;)! After quite a while with the same (stock) icon, I felt it was time to get one that expresses better what beaTunes is all about. And since beaTunes is not a music player, a loudspeaker always seemed like a bad choice to me.&lt;/p&gt;&lt;p&gt;Additionally, I updated some of the other icons used throughout the application.&lt;/p&gt;&lt;p&gt;The second change is not visible and might not be visible for a while. It's localization. Yep, I started taking on the gruesome task of extracting all the strings so that beaTunes can finally speak to more users in their native tongue. At first it's probably just going to be German and (of course) English. Perhaps French will follow.&lt;/p&gt;&lt;p&gt;And here's the obligatory warning: Before downloading and installing this, please make sure you understand what Early Access means:&lt;ul&gt;&lt;li&gt;Absolutely no warranty for whatever&lt;/li&gt;&lt;li&gt;Features may or may not work, appear, and disappear&lt;/li&gt;&lt;li&gt;It may not be possible to migrate data to future versions (even though I make a reasonable effort)&lt;/li&gt;&lt;li&gt;This version will cease to function 2 weeks after its release&lt;/li&gt;&lt;li&gt;You cannot buy this version&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;Just so that there is no doubt about it: EA17 isn't even a beta version (actually, we are getting really damn close to that, though).&lt;/p&gt;&lt;p&gt;And here are the download links:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.beatunes.com/download/beaTunes-2-0-0-EA17-osx.dmg"&gt;beaTunes-2-0-0-EA17 (OS X)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.beatunes.com/download/beaTunes-2-0-0-EA17-win.exe"&gt;beaTunes-2-0-0-EA17 (Windows)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;h2&gt;Note for EA16 users&lt;/h2&gt;&lt;p&gt;There shouldn't be any problems.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-9177214664138391753?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/9177214664138391753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=9177214664138391753' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/9177214664138391753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/9177214664138391753'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/01/iconic-languages.html' title='Iconic Languages'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-7293645082923023115</id><published>2009-01-07T07:09:00.002-05:00</published><updated>2009-01-07T07:13:05.194-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DRM'/><category scheme='http://www.blogger.com/atom/ns#' term='iTunes'/><category scheme='http://www.blogger.com/atom/ns#' term='iTunes Plus'/><title type='text'>iTunes DRM free soon</title><content type='html'>&lt;p&gt;&lt;a href="http://www.beatunes.com/news/uploaded_images/iTunes-794767.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://www.beatunes.com/news/uploaded_images/iTunes-791296.png" border="0" alt="iTunes logo" /&gt;&lt;/a&gt;In case you haven't heard it yet: Apple will start selling only DRM-free songs in their iTunes Store &lt;a href="http://www.tuaw.com/2009/01/06/itunes-pricing-and-drm-schemes-updated-for-2009/"&gt;by the end of March&lt;/a&gt;. This is great news for &lt;a href="http://www.beatunes.com/"&gt;beaTunes&lt;/a&gt; users, as DRM protected songs are notoriously hard to analyze.&lt;/p&gt;&lt;p&gt;Finally! Thanks, Apple.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-7293645082923023115?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/7293645082923023115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=7293645082923023115' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/7293645082923023115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/7293645082923023115'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2009/01/itunes-drm-free-soon.html' title='iTunes DRM free soon'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-5090795615934944225</id><published>2008-12-31T08:33:00.004-05:00</published><updated>2009-01-01T15:12:17.463-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='Early Access'/><title type='text'>NYE Release</title><content type='html'>&lt;p&gt;&lt;a href="http://www.beatunes.com/news/uploaded_images/music_48-731647.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://www.beatunes.com/news/uploaded_images/music_48-728509.png" border="0" alt="beaTunes Logo" /&gt;&lt;/a&gt;EA16 is available. I fixed a number of queue issues - cancel should now work properly and other visual errors should be fixed. Most of the icons used throughout the app can now be replaced through custom themes, as I added a Theme.getResource() method, which is used for looking up icons. Internally a couple of things have changed to aid plugin development. And as a little GUI enhancement, the number of remaining songs in the queue is now displayed as badge on the dock icon (OS X only). And of course there are some other smaller fixes and enhancements.&lt;/p&gt;&lt;p&gt;And here's the obligatory warning: Before downloading and installing this, please make sure you understand what Early Access means:&lt;ul&gt;&lt;li&gt;Absolutely no warranty for whatever&lt;/li&gt;&lt;li&gt;Features may or may not work, appear, and disappear&lt;/li&gt;&lt;li&gt;It may not be possible to migrate data to future versions (even though I make a reasonable effort)&lt;/li&gt;&lt;li&gt;This version will cease to function 2 weeks after its release&lt;/li&gt;&lt;li&gt;You cannot buy this version&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;p&gt;Just so that there is no doubt about it: EA16 isn't even a beta version (actually, we are getting very close to that, though).&lt;/p&gt;&lt;p&gt;And here are the download links:&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.beatunes.com/download/beaTunes-2-0-0-EA16-osx.dmg"&gt;beaTunes-2-0-0-EA16 (OS X)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.beatunes.com/download/beaTunes-2-0-0-EA16-win.exe"&gt;beaTunes-2-0-0-EA16 (Windows)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;h2&gt;Note for EA15 users&lt;/h2&gt;&lt;p&gt;If you have been using the keytogrouping plugin - go to the blog post and download the updated version, remove the old version and put the new one in the plugin folder. Things will fail without removing the old version!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-5090795615934944225?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/5090795615934944225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=5090795615934944225' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/5090795615934944225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/5090795615934944225'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2008/12/nye-release.html' title='NYE Release'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5506959918991245132.post-41176398116923614</id><published>2008-12-18T09:16:00.007-05:00</published><updated>2009-03-23T14:36:43.661-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><title type='text'>Adding a custom menu item</title><content type='html'>&lt;p&gt;&lt;a href="http://www.beatunes.com/news/uploaded_images/music_48-731647.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://www.beatunes.com/news/uploaded_images/music_48-728509.png" border="0" alt="beaTunes Logo" /&gt;&lt;/a&gt;As I mentioned before, beaTunes 2 will be a lot more friendly towards developers who want to write plugins. As a matter of fact, many of the standard components you can see in the UI are plugins already. If you're curious, just unzip the &lt;code&gt;beaTunes.jar&lt;/code&gt; (on OS X open the app bundle and navigate to &lt;code&gt;Contents/Resources/Java&lt;/code&gt; - that's where all the jars are, on Windows, just go to the apps &lt;code&gt;lib&lt;/code&gt; directory) and checkout the file &lt;code&gt;plugin.xml&lt;/code&gt; in the &lt;code&gt;META-INF&lt;/code&gt; directory. That file is read by beaTunes and the classes in it are instantiated and registered with the plugin manager. For you that basically means, you have to include a &lt;code&gt;plugin.xml&lt;/code&gt; in your own plugin jar file.&lt;/p&gt;&lt;p&gt;But this post wasn't supposed to be about plugin.xml, it was supposed to be about how to get a new menu item into beaTunes. And that is actually pretty easy.&lt;/p&gt;&lt;p&gt;Obviously, a menu item is backed by an action, in the case of beaTunes it should be a &lt;code&gt;com.tagtraum.beatunes.action.BaseAction&lt;/code&gt;. So, just subclass &lt;code&gt;BaseAction&lt;/code&gt;. Because &lt;code&gt;getId()&lt;/code&gt; and &lt;code&gt;actionPerformed()&lt;/code&gt; are abstract, you will have to implement them. &lt;code&gt;getId()&lt;/code&gt; is supposed to return a String id. Make something up. &lt;code&gt;actionPerformed()&lt;/code&gt; does whatever you want your action to do.&lt;/p&gt;&lt;pre&gt;public String getId() {&lt;br /&gt;    return "com.mycomp.action.somethingfancy";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void actionPerformed(final ActionEvent e) {&lt;br /&gt;    // do something grand!&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;Now, obviously you want your action to have a name. To give it one, implement a constructor like this:&lt;/p&gt;&lt;pre&gt;public MyAction(final BeaTunes beaTunes) {&lt;br /&gt;    super(beaTunes);&lt;br /&gt;    putValue(Action.NAME, "My Menu Item");&lt;br /&gt;    // add other action properties as you see fit&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;At this point you have an action with a name, an id and some action method, but beaTunes doesn't know yet where to put the thing. To tell it where to show it, you have to override the following method:&lt;/p&gt;&lt;pre&gt;public ActionLocation[] getActionLocations() {&lt;br /&gt;    // install the action in just one location - in this case the tool menu&lt;br /&gt;    return new ActionLocation[] {&lt;br /&gt;        new AbsoluteActionLocation(BeaTunesUIRegion.TOOL_MENU)&lt;br /&gt;    };&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;The sample code above installs the action in the tool menu. Now, unfortunately that does not give you any control over where exactly in the tool menu the action will be placed. To get more control, you can use a &lt;code&gt;RelativeActionLocation&lt;/code&gt;. Like this:&lt;/p&gt;&lt;pre&gt;new RelativeActionLocation(BeaTunesUIRegion.EDIT_MENU,&lt;br /&gt;RelativeActionLocation.RelativePosition.BEFORE, "tree.show.hide")&lt;/pre&gt;&lt;p&gt;This location installs an action in the edit menu, right before the action with the id &lt;code&gt;tree.show.hide&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Now compile your action, put it in a jar and add a &lt;code&gt;META-INF/plugin.xml&lt;/code&gt;-file that looks like this:&lt;/p&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" ?&gt;&lt;br /&gt;&amp;lt;plugins&gt;&lt;br /&gt;    &amp;lt;plugin class="com.yourcomp.MyAction"/&gt;&lt;br /&gt;&amp;lt;/plugins&gt;&lt;/pre&gt;&lt;p&gt;Then place the jar into the &lt;a href="http://www.beatunes.com/news/2008/12/copy-keys-to-grouping-plugin.html"&gt;beaTunes plugin directory&lt;/a&gt; and start beaTunes.&lt;/p&gt;&lt;p&gt;Done!&lt;/p&gt;&lt;p&gt;Note: This code will only work with beaTunes 2. It has been updated for EA16.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5506959918991245132-41176398116923614?l=www.beatunes.com%2Fnews%2Findex.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/41176398116923614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=5506959918991245132&amp;postID=41176398116923614' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/41176398116923614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5506959918991245132/posts/default/41176398116923614'/><link rel='alternate' type='text/html' href='http://www.beatunes.com/news/2008/12/adding-custom-menu-item.html' title='Adding a custom menu item'/><author><name>beaTunes</name><uri>http://www.blogger.com/profile/08889911569333668523</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14148415018408598883'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>