I’ve written a small perl script that traverses one folter hierarchy and checks every mp3 file found against an amarok 2 .4 collection database. The output is a list of all mp3 files in the folder structure that are not in the database.
#!/usr/bin/env perl
require File::Find;
require DBI;
require DBD::mysql;
#put your database details here
#
my $database = '';
my $dbuser = '';
my $dbpass = '';
my $dbhost = '';
# find(\&wanted, @directories_to_search);
# sub wanted { ... }
my $dbh;
my $sth;
my $result;
$dbh = DBI->connect('DBI:mysql:'.$database.';host='.$dbhost, $dbuser, $dbpass) or die "could not connect to database";
# Set the variable $File::Find::dont_use_nlink if you're using AFS,
# since AFS cheats.
# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name = *File::Find::name;
*dir = *File::Find::dir;
*prune = *File::Find::prune;
sub wanted;
# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, '/eregion/mp3');
exit;
sub wanted {
my ($dev,$ino,$mode,$nlink,$uid,$gid);
(($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
/^.*\.mp3\z/si &&
-f _
&& findincollection($name);
}
sub findincollection
{
my $query = "select count(*) from urls where rpath like \"%" . $name . "%\"\;";
$sth = $dbh->prepare($query);
$sth->execute();
$result = $sth->fetch->[0];
if ($result!=1) {
print $name . "\n";
}
}
1 thought on “How to verify your amarok 2 collection database”