You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
5.1 KiB
183 lines
5.1 KiB
<?php |
|
|
|
require 'iTunesLibrary.php'; |
|
|
|
$real_time_start = microtime(true); |
|
|
|
/** |
|
* I moved my iTunes Music folder to a new disc, I don't think I did it properly |
|
* so all my playlists were empty, the tracks in them had new IDs and locations |
|
* There might be a way to recover using iTunes, but with a 250GB library, it's a faff |
|
* moving it around. |
|
* |
|
* So I found myself with an new 'iTunes Library.xml' with empty playlist, but with the |
|
* new track IDs, and an old 'iTunes Music Library.xml' with the old track IDs and names |
|
* |
|
* This script loads up both the old and the new libraries, then, |
|
* for each track in each playlist in the old library, it looks up the |
|
* ID in the new library, using the track name |
|
* Then, if you want, it writes each playlist to an XML file that can be imported into iTunes. |
|
*/ |
|
$newiTunesFile = 'iTunes-new.xml'; |
|
$oldiTunesFile = 'iTunes-old.xml'; |
|
$newiTunesFileGZ = 'iTunes-new.xml.gz'; |
|
$oldiTunesFileGZ = 'iTunes-old.xml.gz'; |
|
|
|
$trackLimit = 5000; |
|
|
|
if (!ini_set('default_charset', 'UTF-8')) { |
|
echo "could not set default_charset to UTF-8<br>"; |
|
} |
|
|
|
echo "ini_get('default_charset') ". ini_get('default_charset')."\n"; |
|
|
|
$writeNewPlaylistFile = true; |
|
$outputDir = "newPlaylists"; |
|
|
|
if ($writeNewPlaylistFile == true) { |
|
if (!file_exists($outputDir)) { |
|
mkdir($outputDir); |
|
} |
|
} |
|
|
|
$time_start = microtime(true); |
|
|
|
// load up old library, and playlists |
|
$oldLibrary = new iTunesLibrary($oldiTunesFile, true, $trackLimit); |
|
|
|
$time = (microtime(true) - $time_start); |
|
printf("Time to load old lib and playlists: %01.3f\n", $time); |
|
|
|
|
|
$time_start = microtime(true); |
|
// load up new library, just the tracks |
|
$newLibrary = new iTunesLibrary($newiTunesFile, false); |
|
|
|
$time = (microtime(true) - $time_start); |
|
printf("Time to load new lib: %01.3f\n", $time); |
|
|
|
|
|
echo "old lib playlist count: " . $oldLibrary->getPlaylistCount() . "\n"; |
|
echo "new lib track count: " . $newLibrary->getCount() . "\n"; |
|
echo "old lib track count: " . $oldLibrary->getCount() . "\n"; |
|
|
|
foreach ($oldLibrary->getPlaylists() as $playlist) { |
|
|
|
$time_start = microtime(true); |
|
|
|
if (count($playlist->tracks)>0 && count($playlist->tracks) < $trackLimit) { |
|
|
|
echo "Playlist Name: $playlist->Name\n"; |
|
|
|
$newTrackIDs = array(); |
|
foreach ($playlist->tracks as $trackID => $trackValues) { |
|
// echo "trackID: $trackID, Name = " . $trackValues["Name"] . "\n"; |
|
list($id, $location) = $newLibrary->getIDAndLocation($trackID, $trackValues["Name"], $trackValues["Total_Time"], $trackValues["Artist"], $trackValues["Album"]); |
|
|
|
// echo "newID: $id, new location: $location\n\n"; |
|
if (is_null($id) == false) { |
|
$newTrackIDs[]=$id; |
|
} |
|
else{ |
|
// echo "OHNO: Could not find new ID for: " . $trackValues["Name"] . "\n"; |
|
} |
|
} |
|
|
|
$time = (microtime(true) - $time_start); |
|
printf("Time to lookup new data for playlist with %u tracks: %01.3f\n",count($playlist->tracks), $time); |
|
// write new xml, need name and trackIds |
|
if ($writeNewPlaylistFile == true && count($newTrackIDs)>0) { |
|
outputPlaylistFile($playlist->Name, $newTrackIDs); |
|
$time = (microtime(true) - $time_start); |
|
printf("Time to write new playlist with %u tracks: %01.3f\n",count($playlist->tracks), $time); |
|
} |
|
} |
|
} |
|
|
|
$time = (microtime(true) - $real_time_start); |
|
printf("Total time: %01.3f\n", $time); |
|
|
|
exit; |
|
/** |
|
* Get the track name and location for a specific track ID |
|
* |
|
* @param string $playlistName |
|
* @param array $trackIDs |
|
* |
|
* @return array |
|
*/ |
|
function outputPlaylistFile($playlistName, $trackIDs){ |
|
|
|
global $outputDir; |
|
$playlistName = $playlistName . "_NEW"; |
|
$playlistNameFilename = $playlistName . ".xml"; |
|
|
|
$header = <<< HEAD |
|
<?xml version="1.0" encoding="UTF-8"?> |
|
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
|
<plist version="1.0"> |
|
<dict> |
|
<key>Tracks</key> |
|
<dict> |
|
HEAD; |
|
|
|
$mid1 = <<< MID1 |
|
</dict><key>Playlists</key> |
|
<array> |
|
<dict> |
|
<key>Name</key><string> |
|
MID1; |
|
|
|
$footer = <<< FOOT |
|
</array> |
|
</dict> |
|
</array> |
|
</dict> |
|
</plist> |
|
FOOT; |
|
|
|
|
|
$mid = <<< MID |
|
</string> |
|
<key>Description</key><string></string> |
|
<key>All Items</key><true/> |
|
<key>Playlist Items</key> |
|
<array> |
|
MID; |
|
|
|
|
|
$str = $header; |
|
|
|
foreach ($trackIDs as $trackID) { |
|
$str = $str ."<key>" . $trackID ."</key>"; |
|
} |
|
|
|
|
|
$str = $str . $mid1 . $playlistName . $mid; |
|
|
|
// loop through tracks |
|
foreach ($trackIDs as $trackID) { |
|
$str = $str . "<dict><key>Track ID</key><integer>" . $trackID . "</integer></dict>"; |
|
} |
|
|
|
$str = $str . $footer; |
|
|
|
$filename = "$outputDir/$playlistNameFilename"; |
|
|
|
if (!$handle = fopen($filename, 'w')) { |
|
echo "Cannot open file ($filename)\n"; |
|
exit; |
|
} |
|
|
|
// Write $somecontent to our opened file. |
|
if (fwrite($handle, $str) === FALSE) { |
|
echo "Cannot write to file ($filename)\n"; |
|
exit; |
|
} |
|
|
|
// echo "Success, wrote to file ($filename)\n"; |
|
|
|
fclose($handle); |
|
} |
|
|
|
?>
|