############################################################################### # # itunes_remove_notfound.pl # # This script will remove "lost" tracks from the iTunes Music library. # # Copyright (C) 2007 Robert Jacobson # written by: Robert Jacobson (http://mysite.verizon.net/teridon/itunesscripts) # Last Updated: 30 July 2007 # Version 1.1 # # This script is GPL v2. see http://www.gnu.org/copyleft/gpl.html # # 1.1 Update loop logic to start at end of list and step backwards through items. # Hopefully this will avoid a possible race condition # ############################################################################### use File::Basename; my $PROGNAME = basename($0); my $VERSION = "1.0"; my $AUTHOR = "Robert Jacobson"; my $HOMEPAGE = "http://mysite.verizon.net/teridon/"; my $YEAR = 2007; my $GNU_URL = "http://www.gnu.org/copyleft/gpl.html"; { print "**************************************************************\n" . "$PROGNAME version $VERSION, Copyright (C) $YEAR $AUTHOR\n" . "Visit $HOMEPAGE for updates\n" . "$PROGNAME comes with ABSOLUTELY NO WARRANTY;\n". "This is free software, and you are welcome\n" . "to redistribute it under certain conditions\n" . "for details see $GNU_URL.\n" . "**************************************************************\n" . "\n" ; } use strict; use Win32::OLE; use Data::Dumper; ## Create the OLE Object my $iTunes = Win32::OLE->new('iTunes.Application') or die Win32::OLE->LastError(); # Get the possible sources my $sources = $iTunes->Sources(); my $sourcesCount = $sources->Count(); my $source = ''; my $sourceKind = ''; my $n = 1; print "There are " . $sourcesCount . " sources currently available\n"; # For each source, figure out kind for ($n = 1; $n <= $sourcesCount; $n++) { $source = $sources->Item($n); $sourceKind = $source->Kind(); # print "source no. " . $n . " is "; # print $sourceKind . " -- "; if ($sourceKind == 0) { print "Unknown Source\n"; } if ($sourceKind == 1) { print "Library Source\n"; # Get the playlists in the Library my $playlists = $source->Playlists(); my $num_playlists = $playlists->Count(); print "There are $num_playlists playlists\n"; # For each playlist, show the name and number of tracks for (my $j = 1 ; $j <= $num_playlists; $j++) { my $playlist = $playlists->Item($j); my $playlist_name = $playlist->Name(); print "\t$j : $playlist_name\n"; } print "Enter comma-seperated playlist numbers: "; chomp (my $nums = ); my @nums = split(/,/ , $nums); for my $i (@nums) { my $playlist = $playlists->Item($i); my $playlist_name = $playlist->Name(); print "You selected $playlist_name\n"; my $tracks = $playlist->Tracks; my $num_tracks = $tracks->Count(); print "\t$num_tracks tracks\n"; my %seen; # Get all the tracks in the playlist for (my $k = $tracks->Count ; $k > 0 ; $k-- ) { #print "num: " , $num_tracks , " Count: ", $tracks->Count , " k: ", $k , "\n"; my $track = $tracks->Item($k); my $track_kind = $track->Kind(); if ($track_kind == 1) { # File my $songname = $track->Name(); my $artist = $track->Artist(); my $path = $track->Location(); #my $tracknum = $track->TrackNumber(); if ($path eq "") { print "\t#### Removing $k : $songname, $artist\n"; #print "delete? "; #chomp (my $ans = ); my $ans = "y"; if ($ans eq "y") { $track->Delete(); #$k -= 1; #$num_tracks = $tracks->Count(); } } } } } } # if ($sourceKind == 2) { # print "iPod Source\n"; } # if ($sourceKind == 3) { # print "Audio CD Source\n"; } # if ($sourceKind == 4) { # print "MP3 CD Source\n"; } # if ($sourceKind == 5) { # print "Device Source\n"; } # if ($sourceKind == 6) { # print "Radio Source\n"; } # if ($sourceKind == 7) { # print "Shared Library Source\n"; } }