<?php
    
include('site.php');
    
page_header('iTunes Sync''androidsync''code');
?>
<h1>Syncing iTunes Playlists</h1>
<p>This script reads your iTunes library and copies specified playlists to any destination folder. It also keeps track of any files that may have been updated since the last sync and copies those across too (e.g. album art updates).</p>
<p><strong><a href="misc/async.pl">Download the script here</a></strong><br /><a href="misc/async-source">Source code</a></p>
<h2>Pre-requisites</h2>
<p>This script will probably only work on Mac OS X. I think it would need some changes to work on Windows which I'm not interested in doing. You will also need Perl installed and also Math::Round and File::Copy;. To install these:</p>
<pre>cpan Math::Round File::Copy</pre>

<h2>Installing the script</h2>
<p>Stick the file in some appropriate directory, such as /usr/local/bin and give it appropriate permissions:</p>
<pre>sudo cp async /usr/local/bin
sudo chmod +x /usr/local/bin/async</pre>
<p>The script should be installed. You will now need to configure it.</p>

<h2>Configuration</h2>
<p>There are two ways to configure the script. The first is to simply edit it with a text editor and replace various variables. The other is to create a configuration file. We'll assume you wish to do the latter.</p>
<p>Create the file ~/.asyncrc and put the following inside it, replacing as needed:</p>
<pre># Async config file
# Your iTunes folder, typically /users/HOME/music/iTunes/
itunes=/users/REPLACE_ME/music/itunes
# Where you want your music copied to (e.g. your USB or Android device)
dest=/volumes/sd card/music
# A list of playlists you want copied. For all your music, then add playlist=library
playlist=bob dylan
playlist=hard
playlist=pink floyd
playlist=favourites
playlist=sync</pre>

<p>Save this file and then run async (simply type async at the command line).</p>

<h2>Mulitple Configuration Files</h2>
<p>You can create multiple configuration files like the above for various needs (e.g. one to sync a usb thumb drive for your car, another for your phone and so on). To use them, simply pass the configuration file as an argument. For example:</p>
<pre>async ~/.carsync</pre>

<h2>Advanced Options</h2>
<p>The configuration file accepts the following options:</p>
<h3>itunes</h3>
<p>The itunes argument specifies where the "iTunes Music Library.xml" file is located. This filename can be changed with itunes_xml (below).</p>
<pre>itunes=/users/matt/music/itunes</pre>
<h3>dest</h3>
<p>The destination directory for your files.</p>
<pre>dest=/volumes/sd card/music</pre>
<h3>itunes_xml</h3>
<p>The filename for your iTunes XML library. Default is iTunes Music Library.xml</p>
<pre>itunes_xml=iTunes Music Library.xml</pre>
<h3>playlist</h3>
<p>Playlist to sync. Can have multiple entries. Use 'library' to sync entire iTunes library.</p>
<pre>playlist=bob dylan
playlist=sync</pre>
<h3>info</h3>
<p>Set to 1 to enable information output (default = 1)</p>
<pre>info=1</pre>
<h3>verbose</h3>
<p>Set to 1 to enable verbose output (default = 0)</p>
<pre>verbose=1</pre>
<h3>debug</h3>
<p>Set to 1 to enable debug output (default = 0)</p>
<pre>debug=0</pre>
<h3>no_copy</h3>
<p>Set to 1 to disable copying for debug purposes (default = 0).</p>
<pre>no_copy=0</pre>
<h3>no_delete</h3>
<p>Set to 1 to disable file/folder deletion for debug purposes (default = 0).</p>
<pre>no_delete=0</pre>
<h3>db_dir</h3>
<p>Directory to store the local changes database (default = ~/.async)</p>
<pre>db_dir=~/.async</pre>
<h3>db_file</h3>
<p>File to store the local changes database in (default = autogenerated)</p>
<pre>db_file=carsync</pre>



<h2>Troubleshooting</h2>
<p>The most common problem is going to be the Perl directory. To fix this, type:</p>
<pre>which perl</pre>
<p>This should give you a directory - e.g. <span style="font-family: monospace;">/usr/bin/perl</span> - edit the async file to put it on the top line, prefixed with a shebang. For example:</p>
<pre>#!/usr/bin/perl</pre>
<p>This script almost certainly won't work on Windows and probably never will. Sorry.</p> 

<?php
    page_footer
();
?>