#!/usr/bin/perl
$Id
:
import
.pl,v 1.2 2005/07/11 15:53:40 joern Exp $
require
"config.pm"
;
my
$USAGE
=
<<__EOU;
Usage: import_from_files.pl directory
Description:
Scans the given directory recursively for .mp3 and .ogg files,
read their tags and adds corresponding entries to the music
database of this Gtk2::Ex::FormFactory tutorial.
__EOU
main: {
my
$dir
=
shift
@ARGV
;
if
( !
$dir
or
@ARGV
) {
print
$USAGE
;
exit
1;
}
my
$config
= Music::Config->new;
$config
->test_db_connection;
die
"Start music.pl first, for database configuration"
unless
$config
->get_db_connection_ok;
scan_directory(
$dir
);
}
sub
scan_directory {
my
(
$dir
) =
@_
;
my
$genre
= Music::Genre->find_or_create({
name
=>
"Unknown"
});
my
(
%artists
,
%albums
);
find (
sub
{
return
unless
/\.(ogg|mp3)$/i;
my
$filename
=
$File::Find::name
;
my
(
$artist
,
$album
,
$song
,
$nr
);
if
(
$filename
=~ /ogg$/i ) {
my
$header
= Ogg::Vorbis::Header->new(
$filename
)
or
return
;
$artist
= (
$header
->comment(
'artist'
))[0];
$album
= (
$header
->comment(
'album'
))[0];
$song
= (
$header
->comment(
'title'
))[0];
$nr
= (
$header
->comment(
'tracknumber'
))[0];
Encode::from_to(
$_
,
"utf8"
,
"latin1"
)
for
(
$artist
,
$album
,
$song
);
}
else
{
my
$tag
= get_mp3tag(
$filename
) or
return
;
$artist
=
$tag
->{ARTIST};
$album
=
$tag
->{ALBUM};
$song
=
$tag
->{TITLE};
$nr
=
$tag
->{TRACKNUM};
}
print
"Found: $artist / $album / $nr - $song\n"
;
my
$artist_obj
=
$artists
{
$artist
} ||
Music::Artist->find_or_create({
name
=>
$artist
});
$artists
{
$artist
} ||=
$artist_obj
;
my
$album_obj
=
$albums
{
"$artist:$album"
} ||
(Music::Album->search ( {
artist
=>
$artist_obj
,
title
=>
$album
} ))[0] ||
$artist_obj
->add_to_albums({
title
=>
$album
,
genre
=>
$genre
,
});
$albums
{
"$artist:$album"
} ||=
$album_obj
;
my
$song_obj
=
Music::Song->search ( {
album
=>
$album_obj
,
title
=>
$song
} ) ||
$album_obj
->add_to_songs ({
nr
=>
$nr
,
title
=>
$song
,
});
},
$dir
);
}