X-Git-Url: https://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2FID3FS%2FDB.pm;h=99c482070f06ee9dbb2d3af331a7d084189a3ddc;hb=bb635a70f6dd0315876ee7862ed71e9e093cd3fd;hp=97ed8831e02ece0cf05127cec0ce9a886072149f;hpb=f2390f03fdde545e04dc7d0acbf7c0dc0fc14c03;p=id3fs.git diff --git a/lib/ID3FS/DB.pm b/lib/ID3FS/DB.pm index 97ed883..99c4820 100644 --- a/lib/ID3FS/DB.pm +++ b/lib/ID3FS/DB.pm @@ -3,7 +3,7 @@ package ID3FS::DB; use strict; use warnings; use DBI; -use ID3FS::File; +use ID3FS::AudioFile; use Cwd; our $SCHEMA_VERSION=1; @@ -169,13 +169,16 @@ sub tags sub tag_values { - my($self, $tag)=@_; - my $sql=("SELECT DISTINCT tagvals.name FROM tags\n" . - "INNER JOIN tags_x_tagvals ON tags.id=tags_x_tagvals.tags_id\n" . - "INNER JOIN tagvals ON tagvals.id=tags_x_tagvals.tagvals_id\n" . - "WHERE tags.name=?"); - my $tags=$self->cmd_rows($sql, $tag); - return(map { $_->[0]; } @$tags); + my($self, $tagid)=@_; + my $sql=("SELECT DISTINCT tagvals.name FROM tagvals\n" . + "INNER JOIN tags_x_tagvals ON tagvals.id=tags_x_tagvals.tagvals_id\n" . + "WHERE tags_x_tagvals.tags_id=?"); + my $tags=$self->cmd_rows($sql, $tagid); + my @tags=map { $_->[0]; } @$tags; + # FIXME: handle when indexing, not here + @tags=map { s/[^[:print:]]//g; $_; } @tags; + @tags=map { length($_) ? $_ : "NOVALUE"; } @tags; + return @tags; } sub artists @@ -280,13 +283,14 @@ sub artist_tracks sub album_tracks { - my($self, $album_id)=@_; + my($self, $artist_id, $album_id)=@_; my $sql=("SELECT files.name FROM files\n\t" . - "INNER JOIN albums ON albums.id=files.albums_id\n\t" . - "WHERE albums.id=?\n\t" . #AND albums.name <> ''\n\t" . + "INNER JOIN albums ON albums.id=files.albums_id\n\t" . + "INNER JOIN artists ON artists.id=files.artists_id\n\t" . + "WHERE artists.id=? AND albums.id=?\n\t" . "GROUP BY files.name\n"); - print "ALBUM_TRACKS SQL($album_id): $sql\n"; - my $result=$self->cmd_rows($sql, $album_id); + print "ALBUM_TRACKS SQL($artist_id, $album_id): $sql\n"; + my $result=$self->cmd_rows($sql, $artist_id, $album_id); my @names=map { $_->[0]; } @$result; @names = map { s/.*\///; $_;} @names; print "TRACKS: ", join(', ', @names), "\n"; @@ -303,7 +307,14 @@ sub tracks } elsif(ref($constraints[$#constraints]) eq "ID3FS::PathElement::Album") { - return $self->album_tracks($constraints[$#constraints]->{id}); + my $artist_id=0; + my $artist=$constraints[($#constraints)-1]; + if(defined($artist) && (ref($artist) eq "ID3FS::PathElement::Artist")) + { + # should always happen + $artist_id=$artist->{id}; + } + return $self->album_tracks($artist_id, $constraints[$#constraints]->{id}); } my $main_sql_start=("SELECT files.name\n" . @@ -373,13 +384,13 @@ sub add { ($pathpart, $filepart) = ($relpath =~ /(.*)\/(.*)/); } - my $file=ID3FS::File->new($path); + my $file=ID3FS::AudioFile->new($path); return unless(defined($file)); my $artist=$file->artist(); my $album=$file->album(); my $v1genre=$file->v1genre(); my $year=$file->year(); - my $audiotype=$file->album(); + my $audiotype=$file->audiotype(); my $tags=$file->tags(); my $haspic=$file->haspic(); @@ -475,6 +486,17 @@ sub lookup_id return $id; } +sub tag_has_values +{ + my($self, $id)=@_; + my $sql=("SELECT COUNT(*) FROM tags\n\t" . + "INNER JOIN tags_x_tagvals ON tags.id=tags_x_tagvals.tags_id\n\t" . + "INNER JOIN tagvals ON tagvals.id=tags_x_tagvals.tagvals_id\n\t" . + "WHERE tags.id=?\n"); + my ($rows)=$self->cmd_onerow($sql, $id); + return $rows; +} + sub relation_exists { my ($self, $relname, $fields)=@_;