Monday, November 30, 2009

Final draft of report finished today

Weighing in at a hefty 3500 words, I have finished the final draft of the report today. I'll probably read it again later, but for now, play time.


Sunday, November 29, 2009 posting

Checking out my google analytics page showed my program was featured on Also a quick search on twitter showed my project was featured on a couple of other blogs as well as tweets.

That's really cool! I've come back from my Thanksgiving family visit and I'll be working on more documentation this week. All of the project materials are due a week from today, so tomorrow I plan on finishing the paper. Tuesday I want to work on the powerpoint and narrate it. The powerpoint only has to be 5-6 minutes long, so it will probably be a demonstration very similar to the early youtube video. After I finish those two things the project will be essentially done.

Hope everyone had a good break.


Tuesday, November 24, 2009

Softpedia and xml parsing

Awesome news! I didn't have anything to do with it, but apparently iTunesDSM is making the rounds. I got an email that SoftPedia had picked up my program and added it to their database! My guess is they saw it on SourceForge and added it there but still way cool!

The xml parsing thing came up because I noticed in one of their screenshots they that had the itunes xml file set an excel file, which of course shouldn't happen, haha! So I've just added some notification of a failed xml file parsing. That will make an appearance in the next release.

Hope everyone has an awesome Thanksgiving! I'll be traveling and if I work on the project, it will be work on the documentation.


Monday, November 23, 2009

Report documentation also updated

I'm still working on the report for the capstone project as well. It's a slow process as I generally hate writing. I know what you're thinking, but you keep us abreast of developments on this blog?! I know but it's easier to write here, then a report.

Javadoc updated

I've updated the javadoc today too and I'll posting it on SourceForge momentarily. There are a few more classes involved mostly listener classes and a few Gui related classes. For the inclined the javadoc is available to read.

Version 0.7.1 released

The new version has mostly logging features built in to help diagnose issues. There are a few other minor additions, most visible is a row selection counter on the remove duplicates panel. If you have updating at start up or go to the help menu and select check for updates, you'll be notified of the new release. Other changes are listed in the change log.


Friday, November 20, 2009

Sometimes frustration is an understatement

You never really know how much you appreciate tracing a bug with the Java exceptions until you mess around with Netbean's GUI editor and for some reason it can't render previews anymore. can get it to show you a message about why it can't make a preview. For instance, you can try the little eye preview button in the builder and it will show the little red icon in the bottom right. But it still isn't easy to find the real problem.

Other than that, I worked more on the Logging system today. It still logs to an html file, but almost the entire program produces log reports now. I was able to add a couple features that make it really handy too. For instance a very, very similar exception stack trace is printed to the log file just like it is to the console by Java. That's very handy, you can see almost exactly what happened, just like you would see it on the console. I also added a couple of other items that are logged.

The Options class will log itself as will the new SysInfo class, that basically provides information on the host computer.

Finally, the html files themselves are formatted in such a way that certain logs will be color coded for easy spotting. All pretty neat.

I'll probably post the new version here soon. I have one user I've been conversing with on Youtube who seems to be having issues and without any kind of reference to go off of it can be difficult to solve the problem.


I use TortoiseSVN to maintain version control as I noted in the blog a few posts ago since SourceForge will host SVN. But, sometimes I mess it up, as happened today, fortunately, I have like 8 backups of code, so nothing was lost.

Have a good weekend everyone,

Thursday, November 19, 2009

Incorporating Logging

I've been working on adding the Logging function. It was previously in the code, but basically slapped together to try it. This time around its much better. I basically have a global java.util.Logger object and then all other classes will reference that object.

It was easy enough to write out the LogRecord object to a file, but everyone knows it sucks reading a text file, so I've moved to an HTMLFormatter object, that's still a work in progress though. I'm stopping for today, I'll work on it more tomorrow.


Worked on documentation and test classes today

I've added some more to the report today, mostly describing the removing duplicates classes. I've also been working on the JUnit classes which have kind of been neglected in the last week.

I've seen some youtube posts, and I've seen some action on the SourceForge page. It's neat to see people using the program! I hope it's working for everyone.


iTunes show (exact) duplicates option

Something I discovered today in iTunes. If you go to File > Show Duplicates it will show you duplicates based on track tag information in iTunes....but....

If you hold down the shift key and then click File > Show Exact Duplicates iTunes will show you the files that are exact duplicates the same ones iTunesDSM removes.

Nevertheless, you still have to manually select and delete each file, if you want an automated process iTunesDSM will do this for you.


Wednesday, November 18, 2009

Documentation work today

In accordance with the Capstone requirements I worked on the final report today. Kind of lame, but necessary.

On a side note, while writing out the pseudocode for the duplicate files algorithm today, I found I could simplify the algorithm much more. So verison 0.7.1 now contains the much faster algorithm. It'll be a little while before I post the new version though.


Email down

I just found out why my email has been down for the past few days and it looks like its going to take a little longer to get back up again. If anyone has emailed me anything, it may have been lost but I'll post an update when it's working again.


UPDATE: It's working now. Turns out my domain name had expired.

Tuesday, November 17, 2009

Version 0.7.0 released

The newest version has been posted and is now hosted on Sourceforge. You can download it with the usual link to the right. The change log blog post has been updated as well as the screenshots.


Version update server changed

I've been switching over to Sourceforge because I'll be graduating soon and I'll lose the free file hosting the university was providing. Included in that was the file that is read to be sure the version of iTunesDSM was up to date. For future reference the version file is now stored on the Sourceforge server.


Sourceforge up!

I have basically got all enough of Sourceforge working to begin using it. I have subversion running, which is really nice, for anyone who thought about setting up their own version control software, its definitely easy to just use Sourceforge. As I stated before, the source won't be released yet as I can't use anything other than what I write until I've graduated, but at that point, I will release the source code.

The download links have been updated on the right. Have a good night everyone.


Version .7 nearing

I've been doing a lot of work on the code lately, aside from the design documentation, and now recently migrating to sourceforge. Yesterday I was finally able to condense down the number of times a progress bar runs through to just one time, rather than show a new progress bar every time a new portion of the background task completes. This was much needed for the user's sake, because, every time a progress bar repeats I believe faith is sort of lost in the progress bar. Why have a progress bar if it keeps repeating from 0 to 100%? Basically to get this working it was a simple math equation, but its much better for the user now.

I've also removed the iTunes version checking as the implementation was poor, this puts it back on the user to make sure iTunes is up to date, but if people are looking for a way to remove duplicates, then I'm sure they are as good about keeping software up to date as I usually am. So, for now, the version of iTunes isn't considered.

Next, I've removed the jAudioTagger libraries from iTunesDSM. It was neat to see the track tag information show up next to the songs in the table, but didn't really serve any purpose. On the plus side, not having to read track tag information is a real speed boost.

Next, I have figured out how to only have to read the options file once throughout each instance of the program. It seemed obvious to do that, but I wasn't sure how to implement it. Now in the very top most class a public static final instance of the Options class is created and set to what the OptionsReadTask class returns. Therefore, the options instance can be accessed from any class later. This again improves speed of the program and greatly reduces the number of times files are accessed in iTunesDSM.

Finally, I've run across a threading issue that I hadn't even thought of. The communication to iTunes is accomplished by JACOB, essentially adding COM support to Java. When I created a playlist in iTunes to add music tracks to, sometimes I couldn't remove the old playlist in time, to create a new one, and the AddTracksTask background task would just finish instantaneously. So for the time being, I've had to remove the functionality that removes old iTunesDSM playlists, and just continually add a new playlist every time tracks are added through iTunesDSM.

Look for the new update soon as well as information on how to download from Sourceforge!



I've decided that I will release the code as open source software, still donation based, but I'll post the code. Here's the deal, however; I can't use any code created by the community while I am still in the Software Engineering program. So, once I graduate in a month here, I will then post the source, but until then I'll use SourceForge as a file host and version control.

Here's the sourceforge page I just setup, I've got some more work to do on it but here's the link....

Friday, November 13, 2009

Design - imifcation - nestyness

For those who don't know me, I make up words like those in the title. It's kind of a catchy introduction as well as a WTF moment for anyone reading it, but seriously can you turn down a story that starts that way?!

Anyway, I've been splitting time between fixing bugs as well as documenting the iTunesDSM program in an official Software Design - iness way. I thought I would first start with UML Class diagrams. For those who don't know UML is the defacto way of diagramming software components otherwise known as Classes.

In order to start UML diagramming, I thought I might start with Visio 2007, but quickly learned Java is not really integrated into the UML support Visio already has. Google saves the day. I first found some stop gap solutions, but then lo and behold a plugin exists for Netbeans that creates UML specifications that are reversed engineered from java files.

Now I know, it's a bad to design software in your head, but I feel that if you can do it, and you are the only person working on it, it's a small project, there aren't to many dependencies involved, and the sky is still blue, it's sorta ok. So I've had to go back and actually diagram the classes using the Netbeans plugin. The picture is an example of an automatically generated UML class diagram for my iTunesDSM project.

Neat huh??!! It saves a lot of time especially since my design-in-head theory is vindicated by automated tasks. I won't go into much detail of how to read this diagram, but for those who do know how you can see the methods of my SongTable class.

Next up is combining the Class diagrams into a comprehensible hierarchy. I also automated Use Case diagrams can be generated by the Netbeans plugin. It may be easier to use Visio for that though, I'll find out.

Monday, November 9, 2009

Short update today as the TS Ida is on its way

Just posting a short update today for the title's reason. I worked on more class testing using Junit. It can be supremely frustrating, but I'm now trying to test some of the Background tasks. It seems there are two ways to really test these. One is to test the direct methods, which makes it easier, since you can treat just as another class you've written, and then you can test the SwingWorkers execution itself, which is pointless I think because it should achieve the same result assuming the SwingWorker is tested sufficiently. I'll leave it at that.


Sunday, November 8, 2009

DefaultTableModel, JTable, and SwingWorker

It seems this problem occurs intermittently but is definitely related to threading. When a user decides to delete files that are deemed duplicates, the files are deleted and the entry is removed from the JTable. The process of deleting files and removing them from the JTable is done in a SwingWorker task with the JTable object passed to the SwingWorker. To remove a row I have a simple method in my SongTable, which extends JTable, that searches for the correct row and then removes it. Sometimes though this error occurs with different array indexes:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 8 >= 8
at java.util.Vector.elementAt(

and you can tell it happens because of threading due to the fact that other output to the command line comes in between the entire exception trace on the command line. In other words, there is more to the exception that is printed but some of my output is printed between exception lines. I have yet to figure this one out. I've tried synchronizing the methods (which was already there) as well as calling the wait() method on other threads using a simple boolean called available that would go to false when something was operating on the SongTable. Still nothing.

My newest theory is it has something to do with the JTable working in the Event Dispatch Thread and the SwingWorker, essentially a thread, interfering but I'm stuck there. I'll keep searching for clues however. Until then, toodles.


UPDATE: 11/8/2009 3:27
I think I have fixed the issue. Here's what was going on. Basically I was trying to modify a component on the Event Dispatch Thread (EDT) which is where the GUI should run. The component was being modified by a different thread and I would essentially have the producer consumer problem. Here are a couple of resources to check out... - look into the invokeLater method

So in the end, and this may not be the way to do it, but I can now modify components in the GUI/EDT from other threads using the invokeLater method inside of my remove row method. Here's the code...

public void removeRow(final File fileToRemove){
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
int fileNameColumn = FILE_COLUMN_NUM;
int rowCount = model.getRowCount();
for(int i=0; i< rowCount ; i++){
String selectedRowFilename = (String) model.getValueAt(i, fileNameColumn);
System.out.println("Removing row " + i + " " + fileToRemove.getName());
assert i < model.getRowCount();

Saturday, November 7, 2009

Release Notes

iTunesDSM version 0.9.6
-Fixed an issue where the iTunes directory would not be found on boot if background monitoring was enabled
-Backup zip file is created of added temporary tracks in case iTunes does not copy files to the music directory

iTunesDSM version 0.9.5 (2/4/2010)
-Fixed issue where new tracks would not be displayed in the song table when adding them manually
-New Options panel ui
-Multiple directories can be monitored, added from, or searched for duplicates in
-Files to add to iTunes are ordered so that files within the iTunes music directory are added first
-Options class now extends the Properties class has been converted fully to a Properties object
-Removed OptionsPanel class
-Options class checks the options file is a compatible version of iTunesDSM

iTunesDSM version 0.9.1 (1/26/2010)
-ProgressMonitorDialog box now has native look and feel
-ProgressMonitorDialog has overloaded methods for calculating percent complete
-CopyFile now has option to monitor progress as well as methods to verify copied file is accurate
-Cleaner SysTrayMain code
-Added OSUtils class
-ITunesXML class has more JUnit Tests
-iTunesXML class is logged to a seperate file
-AddTracksTaskTest class tests more fully
-Fixed System Tray menu for Mac - not allow background monitoring
-iTunesDSM Added Tracks playlist reinstituted
-Version class now uses class level logger
-Changed added tracks file system tray message filepath more readable
-Removed FolderWatcher classes, events, and listeners
-Removed AllFiles classes, events, and listeners
-Fixed Icon resolutions - Added Icon class
-System Tray Icon now retrieved through Icon class
-Next background monitor scan time displayed in System Tray tooltip

iTunesDSM version 0.9.0 (1/20/2010)
-Improved background monitoring reliability
-Added option to set music directory to iTunes music directory
-Added Background Monitor Events and Listeners
-Added start and stop background monitoring to system tray
-Cleaned notifications of background monitoring to system tray only
-Changed all event types to integers instead of strings
-User can now cancel the automatic iTunes XML file search
-Updated program titles
-Only one iTunesDSM window can be opened
-SysTrayMain class implements Status interface
-Log files are deleted at each execution
-Removed ITDSMLogger class
-Background Monitor status is monitored through SysTray icon tooltip
-Donate panel tool tip displays donate url
-Removed status bar
-Parsing of iTunesXML file locations by line now works
-Memory issues fixed
-Removed iTunesDSM playlist in favor of added_tracks.txt file
-Fixed a null pointer issue when the background monitor would try to start and the music directory was null
-Removed iTunesController package in favor of limewire iTunes code
-Options file saved and read from properties xml file
-Temporary iTunes download directories are ignored
-iTunesXML file search progress is displayed in the options panel

iTunesDSM version 0.8.2 (12/30/2009)
-Added check to see if iTunesDSM.exe is running before installing over an old installation
-Installer automatically removes previous version
-Added code to help prevent duplicates from being created when adding tracks(copies to a temp folder)
-Fixed iTunes music directory not parsed on boot when itunes directory is a network drive
-CopyFile class now warns of not enough disk space when copying file
-iTunesDSM now adds songs directly to the library instead of a playlist
-After all tracks have been added a playlist is created with all new tracks
-File choosers now show iTunesDSM icon
-Added seperate logging for Folder Watching
-Added ITOperationStatus to AddTracksTask to be sure iTunes is done copying files
-Added AddToiTunesLibrary class
-Fixed Working Directory in Startup Shortcut

iTunesDSM version 0.8.1 (12/19/2009)
-Fixed Windows 32bit startup shortcut creation

iTunesDSM version 0.8.0 (12/19/2009)
-Added background folder watching
-Added FolderWatch, AllFiles, BackgroundMonitor and Event classes
-Updated Options class to maintain booleans and time delays for folder watching
-Updated Options gui object for background monitoring
-Added SysTray class, TimeSpinner class, StatusBar, StatusObject class
-Added StatusBar
-Added AllFilesProgressEvent/Listener classes
-Removed ProgressMonitor class
-Simplified OptionsPanel code
-Simplified logging
-Improved automatic xml file finding algorithm and background processing
-Added Windows Installer
-Released Source code - I had to wait until I graduated.

iTunesDSM version 0.7.2
-Fixed a bug that would not warn of a failed xml file parsing.

iTunesDSM version 0.7.1 (11/23/2009)
-Simplified search for duplicate files algorithm in DuplicateFiles class
-Added rudimentary logging
-Added HTMLFormatter class, ITDSMLogger class
-Fixed a bug that would bring up iTunes when cleaning folder, but iTunes wasn't needed
-Added selected row count to remove tracks panel, RowCountLabel class, RowCountListener class, SelectionListener class
-Added SysInfo Class
-Fixed a bug that would sometimes cause Netbeans to fail at showing a preview of the GUI - propertyChangeListener on the update checkbox
-Added a dialog box that will warn the user if no options are selected on the Remove Duplicates Panel
-Removed RemoveOrphanedTask class

iTunesDSM version 0.7.0 (11/17/2009)
-Converted Options input and output to ObjectOut/inPutStream writers and readers
-Added OptionsReadTaskTest and OptionsWriteTaskTest classes
-Combined CleanDirectoryTask and RemoveOrphanedTask into CleanITunesTask
-Fixed a bug that would not correctly select all songs in the table if two or more filenames were exactly the same
-Removed jAudioTagger functionality resulting in much improved speed
-Simplified file data that is diplayed in the SongTable JTable by removing track title, track artist and track album information from the rows
-Fixed a bug that would not let the user know an unsuccessful update check was performed
-Added option to check for new version of iTunesDSM at startup
-Removed iTunes version checking
-Removed MediaFiles, FolderWatch and DataIO classes
-Simplified reading options file to one read per application instance
-Condensed AddTracksPanel and RemoveTracksPanel progress bar to one full progress bar
-Progress Bars now show percentage complete.
-Changed how the iTunes playlist is created to avoid threading issues, old iTunesDSM playlists are not deleted anymore
-Modified status labels that appear before and after tasks complete.

iTunesDSM version 0.6.3 (11/6/2009)
-Added Data class
-Added DataTest class
-Changed code that creates new options and exclusions data files

iTunesDSM version 0.6.2 (11/6/2009)
-Added major version number to current version
-Added Version parsing.
-Added iTunes version checking to ensure the proper iTunes version is installed.
-Removed indeterminate progress frame from ITunesXML class.

iTunes DSM version .6.1 (11/4/2009)
-Removed RemoveTrackDisplay class
-Minor UI improvements when scanning for orphaned files
-Added (.mov) video format extension
-Added JUnit tests for more core package classes
-Renamed AudioFileFilter class to MediaFileFilter
-Removed ITunesXMLTask class
-Removed the FileTypePanel class
-Minor source code improvements
-Fixed a bug that would not set the iTunes music directory to the correct directory after choosing another iTunes XML file.  The options panel is then updated with the new information.
-Fixed a UI bug that incorrectly displayed the progress bar in the RemoveOrphanedTask class.
-Finished first drafts of Javadoc for all classes.

iTunes DSM version .6 (11/3/2009)
-Remove Apache libraries that were used to read Property List xml files
-Added rudimentary new version checking
-Added JUnit tests for Options and DuplicateFiles classes
-Changed core.FileWriter class to core.CopyFile to keep clashing
-Removed main class in core package
-Fixed a bug that would only find up to 8 duplicated files, will now find all duplicate files no matter the iteration number

iTunes DSM version .5.1 (11/2/2009)
-Added tooltip to custom extensions option.
-Fixed bug that displayed incorrect string representation of custom extensions in options panel.
-Added junit test class to Extensions class.
-Added official ChangeLog text file.

iTunesDSM version .5 (11/2/2009)
-Added safely add new tracks to iTunes
-Added options panel
-Added exclusions
-Added options input and output

iTunesDSM version .1
-First release

Version 0.6.3 Released

Mostly bug fixes. You can download it on the right.


Friday, November 6, 2009

Extensive work today

Basically I did a couple of things. I updated the Versions class to be much more useful. At first all it simply did was check if strings were equal essentially. And all I was checking was if a new version of iTunesDSM was being hosted. The Versions class is now a more full fledged class. Firstly, I now label iTunesDSM versions with the three integers pertaining to Major Version, Minor Version, and Bug fix version. I'm not sure if Bug fix version is the official term but it works for me.

Secondly, if I'm going to check for new iTunesDSM versions I might as well check for the version of iTunes itself, as any version below 9.0.2 will create duplicates more easily than the current version. In order to get the version of iTunes, I read the XML file, this required some additional code to the ITunesXML class and a few reworks of the methods. I now have a method that extracts a the value of an element given the line to look for. So I can basically search for iTunes specific items in the iTunes XML file. In order to check the version numbers I now parse this string for the three digits giving the version. Basically the string "9.0.2" will give the integers 9, 0, 2 and in one background task I now check for the latest version of iTunesDSM as well as the version of iTunes that is installed, and if iTunes is out of date, I warn the user before closing the program. I consider the newest version of iTunes as a necessity simply because you can't keep old versions of iTunes practically and therefore test them easily.

I also added a Data class today, to simply create a new "data" folder for the files that save user options and exclusions. It's got one method which should be really easy to test tomorrow.

Finally, I've updated the ReadMe document. It had a few grammar errors and some inconsistencies. Also as I've added/removed code, I've tried to keep the documentation up to date.

I'm working on version 0.6.3 as of now, so expect an update here soon.

Have a good weekend everyone.

Thursday, November 5, 2009

iTunesDSM Screenshots

Options tab. Here you set your options such as the directories you want to search for duplicates in or that you would like to add tracks to iTunes from, background monitoring/folder watching, file types to filter, and startup options.  Just click the item on the left to display those sub-options.

Here you can see that iTunesDSM Folder Watching / Background monitoring has been enabled and the user is notified via the System tray.

The Add tracks tab. Here you can have iTunesDSM scan for new tracks to add to iTunes from the music directory manually.  You can also click the View All Added Files button to view a listing of files added to iTunes.  You can also have iTunesDSM check for new tracks in the background essentially monitoring the music directory.

When you are ready to remove duplicate files you move to the Remove Duplicates tab and click Find Duplicates. Once the task is completed you select all or some of the files in the list and then choose how you want to process them. You can back up the files to another folder, and then delete the duplicates. Lastly you can clikc the Remove Orphaned Tracks button to remove orphaned files.  Orphaned tracks are tracks that have been deleted from the music folder but that iTunes thinks still exists. You can see this when the exclamation mark appears next to a track in iTunes. Use this feature to remove those tracks from iTunes.

First draft of Javadoc completed

It took a while and it's pretty mundane, but as every programmer knows, you have to document your code. So today I finished the draft of the javadoc. If you are interested you can view it here.

Wednesday, November 4, 2009


Anyone want to raise their hand at the worst part about programming??!! Yep you guessed it, going back and documenting all of the classes you've written. Following a close second is going back and fixing bugs you find after you've run more tests.

What I've been working on today.
Basically the above. I've created some more JUnit test classes and I'm going back and documenting my classes as well. Overall I haven't found any new bugs to speak of, maybe minor things but nothing show stopping.

I've checking on the web stats for my blog. It looks like I get around 20 new visitors a day! That's exciting, remember if you find the program useful, think about donating to me. I can always use a cup of coffee. No amount is to small.

Hope everyone has a good day

Tuesday, November 3, 2009

Folder watching and JDK 7

I was interested in adding Folder Watching to iTunesDSM so that you could basically have it run at startup and then just automatically add songs to iTunes as new songs were added to the directory. I thought I found a way to do this too here but then I realized you need to run java 1.7/jdk 7 which is still in early release. I then though about implementing my own file watching thread thingy, but that's not really a good idea either as continuing walking the entire file tree every 15 secs is taxing to the system. I could set it up to scan every half an hour or something but even then, it would take a lot of resources. I'll consider it though.


Version .6 out

Updated version today, version .5 was shortlived but that's ok. .6 mostly fixes bugs behind the scenes. iTunesDSM would be unable to find duplicate files that iterations above 8, so if for some reason you had more than 9 duplicate files in the directory then iTunesDSM wouldn't remove all of them. That's now fixed. I also added a version check into the software. On startup it will poll my webspace for the most current version. If the versions are off, then you are given an option to download the newest version. Neat.

Monday, November 2, 2009

Working with JUnit

Today, after releasing the next big update, I began some formal Unit testing. Unit testing simply means that testing units or pieces of the program for bugs. I started with the Extensions class since that is the most direct user class. It's the class that handles parsing the custom extensions essentially. JUnit is interesting, it's integrated into Netbeans, though I accidently imported a newer version of JUnit than what Netbeans shipped with and it seemed to cause some errors later. No biggie now as it's just imported as any other Jar file. Not a whole lot to say about JUnit yet, other than the nice integration though. I plan on testing further this week.

I also got an idea for a very simple way to check for new versions from the client. I was thinking of a simply URL class that reads a text file on my server space from school. The same server that currently hosts iTunesDSM now. Should be simple. For now, toodles.


v.5.1 Released

Fixed a couple of bugs. Added a changelog file. Enjoy!


v.5 Released!!!

I'm posting the new version today. Here's what's new:
  1. Options panel that you can set your music directory and file types to filter.
  2. Add tracks to iTunes that exist in your music directory but not yet in your iTunes library. For example, users are sharing a directory for all their music and one user has bought a new song, but the other iTunes libraries don't know about it. Other wise known as folder watching.
I've added a readme file as well to help new users get up and running. I'm debating on whether or not to record a new YouTube video, I'm not really sure it's necessary, but I might do it anyway.

All of the features are supported on Windows, but unfortunately iTunesDSM relies on COM's to communicate with iTunes and therefore are not available on Macs. You can still use iTunesDSM to backup and/or remove duplicate files from a directory.

If you find any bugs, don't hesitate to email me or post a comment, I will try to fix them.