tag:help.beatunes.com,2009-07-24:/discussions/questions/4819-re-encoding-tracks-and-migrating-itunes-metadatabeaTunes: Discussion 2015-12-23T13:43:58Ztag:help.beatunes.com,2009-07-24:Comment/385216992015-11-21T14:30:50Z2015-11-21T14:30:51ZRe-encoding tracks and migrating itunes metadata<div><p>My iTunes library primarily consists of songs that I ripped from
CD to MP3 using LAME VBR encoding, for maximum compatibility across
devices. Storage is cheap now and it's possible to stream lossless
via Bluetooth to my play devices, so I'd like to re-rip my entire
library using ALAC (probably via dbPowerAmp, but I'm open to other
suggestions).</p>
<p>However, over the years I've added a variety of iTunes metadata
to my collection, particularly ratings. I don't want to lose any of
this. While searching for a way to refresh my library and keep the
metadata, I stumbled on beaTunes. The app looks really cool but I
think I would only buy it if it could help me automatically migrate
my metadata from mp3 to ALAC versions of each song in my library.
(There are over 4100 songs in my library and there's no way I could
migrate all of this manually).</p>
<p>I trolled around the FAQ and forums trying to find out whether
this is possible but did not find anything. Apologies if this has
already been asked/answered. I have a lot of perl and some java
programming experience and I see that beaTunes appears to have an
API interface, so if I'd need to do a little coding to get this
done, I am open to that. Still...some direction would be very
helpful and appreciated!</p></div>Just a random guytag:help.beatunes.com,2009-07-24:Comment/385216992015-11-21T17:44:05Z2015-11-21T17:44:05ZRe-encoding tracks and migrating itunes metadata<div><p>Hey there!</p>
<p>There is no out of the box way of migrating your metadata from
mp3 to ALAC.</p>
<p>However, with a little bit of messing around, it's doable.</p>
<p>Here's what I would suggest:</p>
<ol>
<li>Rip your CDs to ALAC<br></li>
<li>Make a backup, so that if anything goes wrong, you can recover
your original data<br></li>
<li>Add the new files to iTunes (so that you have a ton of
duplicates)<br></li>
<li>Analyze all (old and new) songs for fingerprints (top option in
analysis, uncheck everything else)<br></li>
<li>Create and run a plugin that iterates over your library and
attempts to find ALAC duplicates for mp3 songs. Once found, copies
the metadata and deletes the mp3 file.</li>
</ol>
<p>Now there are three interesting questions connected to this.</p>
<h2><a class="anchor" name="where-does-this-magic-plugin-come-from-" href="#where-does-this-magic-plugin-come-from-"></a>Where does this magic
plugin come from?</h2>
<p>I can write a simple Groovy plugin that more or less does what's
needed. It may not be perfect, but you have a good start (and
source code).</p>
<h2><a class="anchor" name="will-it-work-perfectly-" href="#will-it-work-perfectly-"></a>Will it work perfectly?</h2>
<p>No. It won't work perfectly. The correct ALAC version for some
mp3 files may not be found due to matching issues or perhaps
because there simply isn't an ALAC equivalent to some mp3
files.</p>
<h2><a class="anchor" name="what-happens-to-playlists-" href="#what-happens-to-playlists-"></a>What happens to playlists?</h2>
<p>The suggested solution will not rebuild your playlists, which
will all be broken after the mp3 files are deleted.</p>
<p>So. If you're interested in trying this, let me know. I can
probably work on this on Monday or Tuesday. One question: What
metadata do you need copied? Rating. Something else?</p>
<p>Have a great Saturday night!</p>
<p>-hendrik</p></div>hendriktag:help.beatunes.com,2009-07-24:Comment/385216992015-11-21T18:38:45Z2015-11-21T18:38:48ZRe-encoding tracks and migrating itunes metadata<div><p>Now that's service!!</p>
<p>Definitely agreed on taking a backup first. That was also going
to be my first priority. And I would probably take a backup of the
iTunes database too (after a little google searching on how to do
it).</p>
<p>Here's something that could make this pretty easy: I've always
ripped my files to a directory tree that looks like {artist or
various}{album}{tracknum} - {trackname}.mp3. If I can find an ALAC
ripper that would rip using the same naming convention, the problem
then becomes one of recursing through my music subdirectories and
moving metadata from {filename}.mp3 to {filename}.mp4 where the
filenames are equal in the directory. That seems like an awesome
simplification of the problem that avoids the need for
fingerprinting. What do you think? Still doable with your Groovy
method?</p>
<p>As for the iTunes metadata, I have primarily only used 'rating'
and 'grouping'. But it would be great to migrate some iTunes
tracking items 'plays', 'last played', 'date added', 'love', and
'skips'. I think that's all I'd really want.</p>
<p>As for the playlists, before I re-rip everything, I think I
might be able to export the lists (I use a nifty tool called iTunes
export), rename the extensions in the playlist file, then re-import
the playlist after all ripping is done. That's the theory, at
least.</p>
<p>Then when all is said and done, I can invoke the power of
beaTunes to get rid of duplicates, etc. (Maybe it renames the raw
filenames to something a bit nicer, too?)</p></div>Just a random guytag:help.beatunes.com,2009-07-24:Comment/385216992015-11-22T12:31:59Z2015-11-22T12:31:59ZRe-encoding tracks and migrating itunes metadata<div><blockquote>
<p>If I can find an ALAC ripper that would rip using the same
naming convention, the problem then becomes one of recursing
through my music subdirectories and moving metadata from
{filename}.mp3 to {filename}.mp4 where the filenames are equal in
the directory.</p>
</blockquote>
<p>But only, if CDDB or whatever you use to lookup the track names
returns exactly the same results as when you did it the first time
around, when you ripped your mp3.</p>
<p>With the plugin I had in mind, I would first look for exact name
matches, then similar title matches, and then perhaps acoustic
matching. And yes, that would still work with Groovy (Groovy just
being a Java-like scripting language, <a href="http://www.groovy-lang.org">http://www.groovy-lang.org</a>).</p>
<blockquote>
<p>As for the iTunes metadata, I have primarily only used 'rating'
and 'grouping'. But it would be great to migrate some iTunes
tracking items 'plays', 'last played', 'date added', 'love', and
'skips'.</p>
</blockquote>
<p>Some of those are read-only iTunes fields. E.g. <code>last
played</code> and <code>date-added</code>. And <code>love</code>,
being pretty new is not supported by beaTunes yet.</p></div>hendriktag:help.beatunes.com,2009-07-24:Comment/385216992015-11-23T10:57:44Z2015-11-23T10:57:44ZRe-encoding tracks and migrating itunes metadata<div><p>Hey there,</p>
<p>I had some time to write the promised script (attached).<br>
To install, please place it in your plugin folder and restart
beaTunes. Details are in <a href="http://help.beatunes.com/kb/plugins/how-to-install-a-plugin">http://help.beatunes.com/kb/plugins/how-to-install-a-plugin</a></p>
<p>There will be a new menu item in <code>Tools</code>, which
attempts to find <code>.m4a</code> dupes for <code>.mp3</code>
files and copies some metadata, when it finds such a dupe. <em>For
details, please read the source code.</em> Actually, in any case,
<em>please read the source code!!</em></p>
<p>There is a warning dialog, saying that the old <code>.mp3</code>
files will be deleted. That is not true. However, the script
contains code (commented out) that <em>could</em> do that.</p>
<p>I hope this does what you want it to do — let me know, if
you have any questions.</p>
<p>Cheers,</p>
<p>-hendrik</p></div>hendriktag:help.beatunes.com,2009-07-24:Comment/385216992015-11-25T13:23:38Z2015-11-25T13:23:41ZRe-encoding tracks and migrating itunes metadata<div><p>This is fantastic, thank you. I should have some time over the
holiday to give it a try. To your point about the track names: one
beauty of this process is that I always included the track
number...that should allow exact matching right off the bat.</p>
<p>Happy Thanksgiving!</p></div>Just a random guytag:help.beatunes.com,2009-07-24:Comment/385216992015-11-25T13:27:04Z2015-11-25T13:27:04ZRe-encoding tracks and migrating itunes metadata<div><p>Is the track number only in the file name or also embedded as
track number tag?</p></div>hendriktag:help.beatunes.com,2009-07-24:Comment/385216992015-11-25T23:20:57Z2015-11-25T23:20:58ZRe-encoding tracks and migrating itunes metadata<div><p>I have the track numbers embedded as a tag, too. My plan is to
move the new tracks into the same directory as the old tracks and
then load them into iTunes. So iTunes will see both the mp3 and m4a
versions in the same location.</p></div>Just a random guytag:help.beatunes.com,2009-07-24:Comment/385216992015-11-26T09:32:37Z2015-11-26T09:32:37ZRe-encoding tracks and migrating itunes metadata<div><p>If the track numbers are embedded/tagged, you might also want to
add something like:</p>
<pre>
<code>&& duplicate.getTrackNumber() == song.getTrackNumber()</code>
</pre>
<p>to the appropriate <code>if</code> statement/s.<br>
Methods and properties of <code>AudioSong</code> are documented at
<a href="https://www.beatunes.com/apidocs/com/tagtraum/audiokern/AudioSong.html">
here</a>.</p>
<p>Happy Thanksgiving!</p></div>hendriktag:help.beatunes.com,2009-07-24:Comment/385216992015-11-27T00:49:12Z2015-11-27T00:49:13ZRe-encoding tracks and migrating itunes metadata<div><p>Okay so I've been messing with your plugin quite a bit. I was
trying to modify it to only process mp3/m4a combinations that had
the same exact track number and path (to help avoid incorrect
copies, etc.)</p>
<p>I think I'm pretty close, but when I run the plugin in beatunes
I get "an error occurred:
org.hibernate.exception.SQLGrammarException: could not prepare
statement"). This one is a bit out of my expertise (I don't see any
SQL being run in the plugin, so there must be something going on
under the covers) and hoped you might have an idea. I'm attaching
the file here.</p></div>Just a random guytag:help.beatunes.com,2009-07-24:Comment/385216992015-11-27T09:49:13Z2015-11-27T09:49:13ZRe-encoding tracks and migrating itunes metadata<div><p>Hey,</p>
<p><code>getPath()</code> is a method in <code>AudioSong</code>,
but it is not a column in the internal database (<code>file</code>
isn't either, they are both computed from <code>location</code>).
Therefore you get the SQL error.</p>
<pre>
<code>List<AudioSong> samePath = library.getSongsWithPropertyValue("path", song.getPath())</code>
</pre>
<p>Also, even if the line above was supported in terms of SQL
columns, you would only find songs with exactly the same file name,
as <code>path</code> is not the folder name, but the full path,
incl. the file name itself. And as you cannot have two files with
exactly the same filename, it won't return more than one song.</p>
<p>If you wanted to find songs from the same folder, you'd have to
use <code>getLocation()</code>, find the last slash
(<code>/</code>) and remove what ever comes after that slash.
Something like this should work (untested):</p>
<pre>
<code>List<AudioSong> sameFolder = getSongsWithPropertyLikeValue("location", song.getLocation().substring(0, song.getLocation().lastIndexOf('/')))</code>
</pre>
<p>That aside, did you try out the original plugin? Did it not do
what you wanted?<br>
In other words, what problem did you try to solve with your code
change?<br>
You write:</p>
<blockquote>
<p>to help avoid incorrect copies, etc.</p>
</blockquote>
<p>Can you give examples?</p>
<p>Perhaps using that <code>album</code> condition I put in there
(commented out) helps enforce the "same album" logic you are trying
to enforce by using the same folder? You could also try:</p>
<pre>
<code>List<AudioSong> sameAlbum = library.getSongsWithPropertyValue("album", song.getAlbum())</code>
</pre>
<p>Also, the lines</p>
<pre>
<code>&& duplicate.getDateAdded().getTime() > song.getDateAdded().getTime()
&& Math.abs(duplicate.getTotalTime() - song.getTotalTime()) < 5000)</code>
</pre>
<p>were put in there by me as a safety measure: Make sure songs
with a very different duration (<code>totalTime</code>) or songs
that were added <em>before</em> the mp3 version was added are not
considered duplicates.</p>
<p>Cheers,</p>
<p>-hendrik</p></div>hendriktag:help.beatunes.com,2009-07-24:Comment/385216992015-11-27T13:46:42Z2015-11-27T13:46:43ZRe-encoding tracks and migrating itunes metadata<div><p>This is wonderful, thanks. I was struggling to find the
properties available, and I was afraid that getLocation might
behave like you stated, so thank you for the fix to find just the
folder.</p>
<p>I didn't try the original plug-in yet. You've been a fantastic
help and I know you wrote it for a very general purpose (the right
thing to do!) but because I know how I manage my folders, I had
hoped to modify it for my specific case and dust off some coding
chops in the process.</p></div>Just a random guytag:help.beatunes.com,2009-07-24:Comment/385216992015-11-28T14:40:20Z2015-11-28T14:40:20ZRe-encoding tracks and migrating itunes metadata<div><blockquote>
<p>I was struggling to find the properties available</p>
</blockquote>
<p>Yeah. That's not well documented, unfortunately.</p>
<blockquote>
<p>I didn't try the original plug-in yet. You've been a fantastic
help and I know you wrote it for a very general purpose (the right
thing to do!) but because I know how I manage my folders, I had
hoped to modify it for my specific case and dust off some coding
chops in the process.</p>
</blockquote>
<p>Cool cool. I'm curious to know how this went in the end.</p>
<p>Enjoy the weekend!</p>
<p>-hendrik</p></div>hendriktag:help.beatunes.com,2009-07-24:Comment/385216992015-11-29T00:09:01Z2015-11-29T00:09:02ZRe-encoding tracks and migrating itunes metadata<div><p>It continues to be interesting. :)</p>
<p>First off, I went ahead and bought the software. I had been
putting it off while I evaluated this process we've been working
through but as soon as I tried the analyze and inspect features, I
was hooked. Key and bpm determinations? Lyrics embedding?
Seriously? Well done.</p>
<p>As for the coding, I actually think my method works pretty well
with your suggested modification (I had to add the 'library' class
to the getSongsWithPropertyLikeValue. What I ran into is that the
location of some of my songs appears to iTunes in two different
parent directories...sometimes iTunes thinks they live in
"c:\users\USER\documents..." and other times in "c:\documents and
settings\USER\My Documents...", even though the folders are
essentially the same (just a symlink issue). In other words, the
mp3 version might look like it lives in the first folder whereas
the same song, m4a version in the other folder...but both songs
really do live in the same subfolder under that tree.</p>
<p>So I tried this (strip off all but the last two folders for the
comparison)...but it just doesn't work.</p>
<pre>
<code>List<AudioSong> sameFolder = library.getSongsWithPropertyLikeValue("location", song.getLocation().substring(StringUtils.lastOrdinalIndexOf(song.getLocation(),'/',3)+1, song.getLocation().lastIndexOf('/')))</code>
</pre>
<p>I also tried your initial script but it didn't seem to find as
many duplicates as I was expecting in my testing.</p></div>Just a random guytag:help.beatunes.com,2009-07-24:Comment/385216992015-11-30T11:47:09Z2015-11-30T11:47:09ZRe-encoding tracks and migrating itunes metadata<div><p>Hey,</p>
<p>regarding</p>
<pre>
<code>List<AudioSong> sameFolder = library.getSongsWithPropertyLikeValue("location", song.getLocation().substring(StringUtils.lastOrdinalIndexOf(song.getLocation(),'/',3)+1, song.getLocation().lastIndexOf('/')))</code>
</pre>
<p>where did you import the <code>StringUtils</code> from? Can you
please post the current version of the script? Any error messages
in the logs?</p>
<p>Thanks,</p>
<p>-hendrik</p></div>hendriktag:help.beatunes.com,2009-07-24:Comment/385216992015-12-03T00:09:00Z2015-12-03T00:09:02ZRe-encoding tracks and migrating itunes metadata<div><p>I found the stringutils at
org.apache.commons.lang3.StringUtils.</p>
<p>The current version is attached. Please excuse the debug code,
but it did seem to suggest that the code was finding the directory
as I had hoped. Unfortunately I'm just not sure why it's not
finding the mp3/m4a dupes the way I was expecting (using some test
cases).</p></div>Just a random guytag:help.beatunes.com,2009-07-24:Comment/385216992015-12-03T08:13:03Z2015-12-03T08:13:03ZRe-encoding tracks and migrating itunes metadata<div><p>Hey,</p>
<p>I believe the problem may lie in beaTunes rather than the
plugin.<br>
Can you please stop beaTunes and install <a href="https://www.beatunes.com/download/beaTunes-4-5-7-SNAPSHOT-x64.exe">
https://www.beatunes.com/download/beaTunes-4-5-7-SNAPSHOT-x64.exe</a>
(assuming you are on a 64bit system)? It contains a change that
will probably help doing wildcard searches on location values.</p>
<p>Thanks,</p>
<p>-hendrik</p></div>hendriktag:help.beatunes.com,2009-07-24:Comment/385216992015-12-04T00:43:45Z2015-12-04T00:43:45ZRe-encoding tracks and migrating itunes metadata<div><p>Cool beans. I downloaded and installed it, but it just keeps
crashing on me when I try to run the groovy script. I'm not finding
any errors in system-error or on the beaTunes log files to share
with you, unfortunately.</p></div>Just a random guytag:help.beatunes.com,2009-07-24:Comment/385216992015-12-04T06:35:18Z2015-12-04T06:35:18ZRe-encoding tracks and migrating itunes metadata<div><blockquote>
<p>but it just keeps crashing</p>
</blockquote>
<p>What exactly do you mean with that? How can you tell it
crashes?</p></div>hendriktag:help.beatunes.com,2009-07-24:Comment/385216992015-12-04T12:43:04Z2015-12-04T12:43:05ZRe-encoding tracks and migrating itunes metadata<div><p>I start the program and then select the script to find the
duplicates. It gives me the warning message, I click through it,
and then it starts the duplicates processing. But during the
processing the program just 'disappears' and is no longer
running.</p></div>Just a random guytag:help.beatunes.com,2009-07-24:Comment/385216992015-12-04T13:29:55Z2015-12-04T13:29:55ZRe-encoding tracks and migrating itunes metadata<div><p>Well, that's not good...</p>
<p>Upon restart, does beaTunes offer to upload logs?<br>
If so, please do.</p>
<p>In any case, can you please attach the logs? Preferably, zip the
whole <code>logs</code> folder, not just individual files.</p>
<p>Thank you!</p>
<p>One more question: Based on your logs, do you have any idea on
what call in the script beaTunes crashes?</p></div>hendriktag:help.beatunes.com,2009-07-24:Comment/385216992015-12-04T23:29:50Z2015-12-04T23:29:54ZRe-encoding tracks and migrating itunes metadata<div><p>I just uploaded them, hope that helps!</p></div>Just a random guytag:help.beatunes.com,2009-07-24:Comment/385216992015-12-05T14:10:08Z2015-12-05T14:10:08ZRe-encoding tracks and migrating itunes metadata<div><p>Thanks. Very odd.</p>
<p>First of all, please change:</p>
<pre>
<code>duplicate.getTrackNumber().equals(song.getTrackNumber())</code>
</pre>
<p>to</p>
<pre>
<code>duplicate.getTrackNumber() == song.getTrackNumber()</code>
</pre>
<p>That's probably not the cause of any crash, but just to be on
the safe side.</p>
<p>Usually, when beaTunes crashes, it saves a crash log in your
home dir (<code>C:\Users\Sean</code>). Crash logs start with the
letters <code>hs</code>. Are there any such files in your home
directory? If so, can you please attach them?</p>
<p>Also, <em>after</em> a crash and <em>before</em> you restart
beaTunes, is there a file called
<code>C:\Users\Sean\.beaTunes-gc.log</code>? Can you please send it
my way as well? The file should always be there, when beaTunes is
running—I'm really only interested in its contents right
after a crash.</p>
<p>That aside, it seems that beaTunes finds a bunch of folders and
at some point—as you stated—simply crashes.</p>
<p>You uploaded logs for a single run. Does it crash at the same
time each run? I.e. in the same folder?</p>
<p>After:</p>
<pre>
<code>if (isMp3) {</code>
</pre>
<p>Can you please insert:</p>
<pre>
<code>log.info("testing: " + song)</code>
</pre>
<p>This would allow us to see, whether it always crashes on the
same song...</p>
<p>-hendrik</p></div>hendriktag:help.beatunes.com,2009-07-24:Comment/385216992015-12-05T20:40:57Z2015-12-05T20:40:58ZRe-encoding tracks and migrating itunes metadata<div><p>Prior to this change, it was definitely crashing consistently
but I couldn't tell if it was a particular song.</p>
<p>Rebooted machine (just in case) and made the code changes.</p>
<p>I'm not finding any of the hs crash logs or the .beaTunes log
though.</p>
<p>I ran it once and it crashed. Ran it a second time and it
finished. Unfortunately it still failed to copy the metadata for my
known test cases.</p>
<p>Appreciate your continued thoughts on this one. It feels like
we're really close, just not sure what needs to be tweaked.</p></div>Just a random guytag:help.beatunes.com,2009-07-24:Comment/385216992015-12-06T08:14:17Z2015-12-06T08:14:17ZRe-encoding tracks and migrating itunes metadata<div><p>This is a really odd kind of crash. Typically there is more to
work with. :-(</p>
<blockquote>
<p>Unfortunately it still failed to copy the metadata for my known
test cases.</p>
</blockquote>
<p>In the last version of your plugin, as far as I can tell,
copying properties was disabled. Only an empty
<code>setComment()</code> method was called. Is that perhaps still
the case?</p></div>hendriktag:help.beatunes.com,2009-07-24:Comment/385216992015-12-06T16:53:58Z2015-12-06T16:54:01ZRe-encoding tracks and migrating itunes metadata<div><p>Perhaps I uploaded an old version? Here's what I am seeing:</p>
<p>` } else if (duplicates.size() == 1) {
mp3Songs.add(song.getId()) AudioSong duplicate = duplicates.get(0)
log.info("One M4A duplicate found for " + song + ": " + duplicate +
" with rating " + duplicate.getRating()) // Let's do this only if
the dupe doesn't already have a rating (we may be running this
process multiple times over the life of the library) if
(duplicate.getRating() == 0) { log.info("Copying metadata...")
copyProperties(song, duplicate) setComment(song, duplicate) }<br>
// either delete the original file later, in finishProcessing() //
or do the same thing with the standard beaTunes inspection later. }
else { log.info("Multiple M4A duplicates found for " + song + ".
Doing nothing.") } } }</p>
<pre>
<code> def void copyProperties(AudioSong mp3Song, AudioSong m4aSong) {
m4aSong.setRating(mp3Song.getRating())</code>
</pre>
<p>// Commented to keep dbPowerAmp grouping (seems very complete)
// m4aSong.setGrouping(mp3Song.getGrouping())
m4aSong.setSkipCount(mp3Song.getSkipCount())
m4aSong.setPlayCount(mp3Song.getPlayCount())
m4aSong.setPlayDate(mp3Song.getPlayDate())
m4aSong.setKey(mp3Song.getKey())
m4aSong.setMood(mp3Song.getMood())</p>
<pre>
<code> // add other fields here. they are documented
// in https://www.beatunes.com/apidocs/com/tagtraum/audiokern/AudioSong.html
}
def void setComment(AudioSong mp3Song, AudioSong m4aSong) {
}`</code>
</pre></div>Just a random guytag:help.beatunes.com,2009-07-24:Comment/385216992015-12-06T16:55:15Z2015-12-06T16:55:16ZRe-encoding tracks and migrating itunes metadata<div><p>Oh heavens that didn't work well at all. Trying again:</p>
<pre>
<code> } else if (duplicates.size() == 1) {
mp3Songs.add(song.getId())
AudioSong duplicate = duplicates.get(0)
log.info("One M4A duplicate found for " + song + ": " + duplicate + " with rating " + duplicate.getRating())
// Let's do this only if the dupe doesn't already have a rating (we may be running this process multiple times over the life of the library)
if (duplicate.getRating() == 0) {
log.info("Copying metadata...")
copyProperties(song, duplicate)
setComment(song, duplicate)
}
// either delete the original file later, in finishProcessing()
// or do the same thing with the standard beaTunes inspection later.
} else {
log.info("Multiple M4A duplicates found for " + song + ". Doing nothing.")
}
}
}
def void copyProperties(AudioSong mp3Song, AudioSong m4aSong) {
m4aSong.setRating(mp3Song.getRating())
// Commented to keep dbPowerAmp grouping (seems very complete)
// m4aSong.setGrouping(mp3Song.getGrouping())
m4aSong.setSkipCount(mp3Song.getSkipCount())
m4aSong.setPlayCount(mp3Song.getPlayCount())
m4aSong.setPlayDate(mp3Song.getPlayDate())
m4aSong.setKey(mp3Song.getKey())
m4aSong.setMood(mp3Song.getMood())
// add other fields here. they are documented
// in https://www.beatunes.com/apidocs/com/tagtraum/audiokern/AudioSong.html
}
def void setComment(AudioSong mp3Song, AudioSong m4aSong) {
}</code>
</pre></div>Just a random guytag:help.beatunes.com,2009-07-24:Comment/385216992015-12-06T20:23:01Z2015-12-06T20:23:01ZRe-encoding tracks and migrating itunes metadata<div><p>OK - but you do find <code>Copying metadata...</code> messages
in your logs? Any errors in the logs?</p>
<p>Regarding the crashing issue:</p>
<p>Can you please start beaTunes as described below. Perhaps that
gives us some hint as to why it's crashing:</p>
<ul>
<li>Open a command shell and type:</li>
<li><code>cd C:\Program Files\beaTunes4\lib</code> (assuming you
used the default installation location)</li>
<li>
<p>Then execute (you'll have to copy and paste this <em>one</em>
line):</p>
<p><code>..\jre\bin\java.exe -Xmx512M -cp
none.jar;.\amazon-4.5.7-SNAPSHOT.jar;.\antlr-2.7.7.jar;.\asm-3.0.jar;.\asm-commons-3.0.jar;.\asm-tree-3.0.jar;.\audiokern-4.5.7-SNAPSHOT.jar;.\audiokern-win-4.5.7-SNAPSHOT.jar;.\beatunes-4.5.7-SNAPSHOT.jar;.\build-tools-4.5.7-SNAPSHOT.jar;.\c3p0-0.9.2.1.jar;.\com4j-20120426-2.jar;.\commons-codec-1.10.jar;.\commons-lang3-3.4.jar;.\core-4.5.7-SNAPSHOT.jar;.\core-win-4.5.7-SNAPSHOT.jar;.\dom4j-1.6.1.jar;.\dozetunes-4.5.7-SNAPSHOT.jar;.\ffsampledsp-java-0.9.10.jar;.\forms-1.1-preview.jar;.\forms_rt-7.0.3.jar;.\groovy-all-2.4.5.jar;.\h2-1.3.175.jar;.\h2migration-4.5.7-SNAPSHOT.jar;.\hibernate-c3p0-4.3.10.Final.jar;.\hibernate-commons-annotations-4.0.5.Final.jar;.\hibernate-core-4.3.10.Final.jar;.\hibernate-jpa-2.1-api-1.0.0.Final.jar;.\jai-codec-1.1.3.jar;.\jai-core-1.1.3.jar;.\jandex-1.1.0.Final.jar;.\japlscript-java-3.1.2.jar;.\jaudiotagger-2.2.2-20150104.144003-1.jar;.\javassist-3.18.1-GA.jar;.\jboss-logging-3.1.3.GA.jar;.\jboss-logging-annotations-1.2.0.Beta1.jar;.\jboss-transaction-api_1.2_spec-1.0.0.Final.jar;.\jdom-1.0.jar;.\jipes-0.9.11.jar;.\jruby-complete-9.0.3.0.jar;.\json-simple-1.1.1.jar;.\jul-to-slf4j-1.7.12.jar;.\jython-standalone-2.7.0.jar;.\log4j-1.2.17.jar;.\lucene-core-3.0.3.jar;.\lucene-snowball-3.0.3.jar;.\mac_widgets-0.9.5.1.jar;.\mchange-commons-java-0.2.3.4.jar;.\mfsampledsp-0.9.5.jar;.\musiclibrary-4.5.7-SNAPSHOT.jar;.\obstunes-4.5.7-SNAPSHOT.jar;.\pcmsampledsp-0.9.3.jar;.\qtsampledsp-java-0.9.6.jar;.\scribe-1.3.6.jar;.\slf4j-api-1.7.12.jar;.\slf4j-log4j12-1.7.12.jar;.\timingframework-1.0.jar;.\tunes-4.5.7-SNAPSHOT.jar;.\ubermusic-4.5.7-SNAPSHOT.jar;.\xom-1.1.jar;.\boot.zip
com.tagtraum.beatunes.BeaTunes</code></p>
</li>
</ul>
<p>This will start beaTunes with the shell window left open. My
hope is, that in the case of a crash, there will be
<em>something</em> there... Hopefully.</p></div>hendriktag:help.beatunes.com,2009-07-24:Comment/385216992015-12-13T23:31:48Z2015-12-13T23:31:51ZRe-encoding tracks and migrating itunes metadata<div><p>Sorry it's been a busy week. I'm just getting back to this
now.</p>
<p>Here is what I get from the command line when I execute it:</p>
<pre>
<code>2015-12-13 18:18:00,178 [ 15265] [ERROR][AWT-EventQueue-0] com.tagtraum.dozetunes.ITunesImpl: java.lang.IllegalArgumentException: Illegal base64 character a
java.lang.IllegalArgumentException: Illegal base64 character a
at java.util.Base64$Decoder.decode0(Base64.java:714)
at java.util.Base64$Decoder.decode(Base64.java:526)
at com.tagtraum.dozetunes.ITunesImpl.getITunesMusicLibraryFiles(ITunesImpl.java:228)
at com.tagtraum.beatunes.BeaTunes.e(SourceFile:1050)
at com.tagtraum.beatunes.BeaTunes.init(SourceFile:3027)
at com.tagtraum.beatunes.BeaTunes.<init>(SourceFile:358)
at com.tagtraum.beatunes.BeaTunes.a(SourceFile:1879)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)</code>
</pre>
<p>And then I get about 60 lines of this on the command line when I
run the plugin:</p>
<pre>
<code>2015-12-13 18:18:52,617 [ 67704] [ERROR][TunesUtilities] com.tagtraum.dozetunes.TrackImpl: Failed to obtain path for com.tagtraum.dozetunes.FileTrackImpl[null,source=-1,playlist=-1,track=-1,trackDatabase=-1]: java.lang.NullPointerException</code>
</pre>
<p>Taking a look inside the beaTunes.log, I see these:</p>
<pre>
<code>2015-12-13 18:18:00,219 [ 15306] [WARN ][AWT-EventQueue-0] com.tagtraum.tunes.TunesUtilities: invokeAndWait() should probably not be called from AWT Event Thread to prevent deadlocks.
java.lang.RuntimeException: Wrong Thread: Thread[AWT-EventQueue-0,6,main]
at com.tagtraum.tunes.TunesUtilities.invokeAndWait(TunesUtilities.java:306)
at com.tagtraum.dozetunes.ITunesImpl.getITunes(ITunesImpl.java:78)
at com.tagtraum.dozetunes.ITunesImpl.getITunes(ITunesImpl.java:63)
at com.tagtraum.dozetunes.ITunesImpl.getLibrarySource(ITunesImpl.java:460)
at com.tagtraum.beatunes.BeaTunes.e(SourceFile:1052)
at com.tagtraum.beatunes.BeaTunes.init(SourceFile:3027)
at com.tagtraum.beatunes.BeaTunes.<init>(SourceFile:358)
at com.tagtraum.beatunes.BeaTunes.a(SourceFile:1879)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
2015-12-13 18:18:00,222 [ 15309] [WARN ][AWT-EventQueue-0] com.tagtraum.tunes.TunesUtilities: invokeAndWait() should probably not be called from AWT Event Thread to prevent deadlocks.
java.lang.RuntimeException: Wrong Thread: Thread[AWT-EventQueue-0,6,main]
at com.tagtraum.tunes.TunesUtilities.invokeAndWait(TunesUtilities.java:306)
at com.tagtraum.dozetunes.ITunesImpl.getITunes(ITunesImpl.java:78)
at com.tagtraum.dozetunes.ITunesImpl.getITunes(ITunesImpl.java:63)
at com.tagtraum.dozetunes.ItemImpl.getId(ItemImpl.java:157)
at com.tagtraum.beatunes.BeaTunes.e(SourceFile:1052)
at com.tagtraum.beatunes.BeaTunes.init(SourceFile:3027)
at com.tagtraum.beatunes.BeaTunes.<init>(SourceFile:358)
at com.tagtraum.beatunes.BeaTunes.a(SourceFile:1879)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)</code>
</pre>
<p>To your other question, I do see one instance of the 'copying
metadata' log entry but the plugin ends with a "15 files copied"
message at the end.</p>
<p>Here's a question: is there a way I can send a private document
to you? I'd like to build a word document of some screenshots to
illustrate my 'control' tests to see if that might help us debug.
Or if you have a public pgp key I can encrypt and upload into a
followup post here.</p></div>Just a random guytag:help.beatunes.com,2009-07-24:Comment/385216992015-12-14T08:39:55Z2015-12-14T08:39:55ZRe-encoding tracks and migrating itunes metadata<div><p>Hey there,</p>
<p>None of these message trouble me very much.</p>
<p>When you recorded these messages, did beaTunes crash?</p>
<p>You can send private messages to <a href="mailto:support@tagtraum.com">support@tagtraum.com</a></p>
<p>Cheers,</p>
<p>-hendrik</p></div>hendriktag:help.beatunes.com,2009-07-24:Comment/385216992015-12-23T12:41:26Z2015-12-23T12:41:27ZRe-encoding tracks and migrating itunes metadata<div><p>Understood regarding the error messages.</p>
<p>It looks like the message board blocked your email address. Any
other ideas?</p></div>Just a random guytag:help.beatunes.com,2009-07-24:Comment/385216992015-12-23T13:43:10Z2015-12-23T13:43:10ZRe-encoding tracks and migrating itunes metadata<div><p>When you recorded these messages, did beaTunes crash?</p>
<p>The email address is support (at) tagtraum.com</p></div>hendriktag:help.beatunes.com,2009-07-24:Comment/385216992015-12-23T13:43:57Z2015-12-23T13:43:57ZRe-encoding tracks and migrating itunes metadata<div><p>When you recorded these messages, did beaTunes crash?</p>
<p>The email address is support (at) tagtraum.com</p></div>hendrik