[mb-commits] r9922 - in mb_server/branches/TemplateToolkit: lib/MusicBrainz/Server/Controller root/artist root/components
root at musicbrainz.org
root at musicbrainz.org
Mon Jun 30 21:28:51 UTC 2008
Author: acid2
Date: 2008-06-30 21:28:51 +0000 (Mon, 30 Jun 2008)
New Revision: 9922
Added:
mb_server/branches/TemplateToolkit/lib/MusicBrainz/Server/Controller/Release.pm
mb_server/branches/TemplateToolkit/lib/MusicBrainz/Server/Controller/Url.pm
mb_server/branches/TemplateToolkit/root/artist/ar-summary.tt
Modified:
mb_server/branches/TemplateToolkit/lib/MusicBrainz/Server/Controller/Artist.pm
mb_server/branches/TemplateToolkit/root/artist/header.tt
mb_server/branches/TemplateToolkit/root/artist/landing.tt
mb_server/branches/TemplateToolkit/root/artist/tags.tt
mb_server/branches/TemplateToolkit/root/components/entity-link.tt
Log:
Added support for ARs and also refactored the code a little
Modified: mb_server/branches/TemplateToolkit/lib/MusicBrainz/Server/Controller/Artist.pm
===================================================================
--- mb_server/branches/TemplateToolkit/lib/MusicBrainz/Server/Controller/Artist.pm 2008-06-30 15:22:07 UTC (rev 9921)
+++ mb_server/branches/TemplateToolkit/lib/MusicBrainz/Server/Controller/Artist.pm 2008-06-30 21:28:51 UTC (rev 9922)
@@ -12,9 +12,38 @@
=head1 METHODS
+=head2 artistLink
+
+Create stash data to create a link to an artist, in an form that can be then displayed by
+root/components/entity-link.tt
+
=cut
+sub artistLink
+{
+ my $artist = @_;
+ artistLinkRaw $artist->GetName, $artist->GetMBId;
+}
+
+=head2 artistLinkRaw
+
+Create stash data to link to an artist, but given the parameters explicity (rather than requiring an
+Artist object)
+
+=cut
+
+sub artistLinkRaw
+{
+ my ($name, $mbid) = @_;
+
+ {
+ name => $name,
+ mbid => $mbid,
+ type => 'artist'
+ };
+}
+
=head2 show
Shows an artist's main landing page, showing all of the releases that are attributed to them
@@ -27,16 +56,15 @@
use Encode qw( decode );
use MusicBrainz::Server::Artist;
+ use MusicBrainz::Server::Link;
use MusicBrainz::Server::Release;
use MusicBrainz::Server::Tag;
use MusicBrainz::Server::Validation;
use MusicBrainz;
use ModDefs;
- if($mbid ne "")
- {
- MusicBrainz::Server::Validation::IsGUID($mbid) or $c->error("Not a valid GUID");
- }
+ # Validate the MBID
+ $c->error("Not a valid GUID") unless MusicBrainz::Server::Validation::IsGUID($mbid);
# Load the artist
my $mb = new MusicBrainz;
@@ -46,85 +74,68 @@
$artist->SetMBId($mbid);
$artist->LoadFromId(1) or $c->error("Failed to load artist");
- # Load tags
- my $tagCount = 5;
- my $t = MusicBrainz::Server::Tag->new($mb->{DBH});
- my $tagHash = $t->GetTagHashForEntity('artist', $artist->GetId, $tagCount + 1);
+ $c->error("You cannot view the special DELETED_ARTIST")
+ if $artist->GetId == ModDefs::DARTIST_ID;
- my @tags = sort { $tagHash->{$b} <=> $tagHash->{$a}; } keys %{$tagHash};
+ # Load data for the landing page
+ my @tags = LoadArtistTags ($mb->{DBH}, 5, $artist);
+ my @arLinks = LoadArtistARLinks ($mb->{DBH}, $artist);
+ my @releases = LoadArtistReleases ($artist);
- # Load releases
- my @releases = $artist->GetReleases(1, 1);
- my $onlyHasVAReleases = (scalar @releases) == 0;
+ # Create data structures for the template
+ #
- my @shortList;
-
- for my $release (@releases)
+ # ARs:
+ my @prettyArs;
+ my $currentArGroup = undef;
+ for my $ar (@arLinks)
{
- my ($type, $status) = $release->GetReleaseTypeAndStatus;
+ if(not defined $currentArGroup or $currentArGroup->{connector} ne $ar->{link_phrase})
+ {
+ $currentArGroup = {
+ connector => $ar->{link_phrase},
+ type => $ar->{link_type},
+ entities => []
+ };
+ push @prettyArs, $currentArGroup;
+ }
- # Construct values to sort on
- $release->SetMultipleTrackArtists($release->GetArtist != $release->GetId() ? 1 : 0);
- $release->{_is_va_} = ($release->GetArtist == &ModDefs::VARTIST_ID or
- $release->GetArtist != $release->GetId());
- $release->{_is_nonalbum_} = ($type == MusicBrainz::Server::Release::RELEASE_ATTR_NONALBUMTRACKS);
- $release->{_section_key_} = ($release->{_is_va_} . " " . $type);
- $release->{_name_sort_} = lc decode "utf-8", $release->GetName;
- $release->{_disc_max_} = 0;
- $release->{_disc_no_} = 0;
- $release->{_firstreleasedate_} = ($release->GetFirstReleaseDate || "9999-99-99");
+ my $entity;
- CheckAttributes($release);
-
- # Attempt to sort "disc x [of y]" correctly
- if ($release->{_name_sort_} =~
- /^(.*) # $1 <main title>
- (?:[(]disc\ (\d+) # $2 (disc x
- (?:\ of\ (\d+))? # $3 [of y]
- (?::[^()]* # [: <disc title>
- (?:[(][^()]*[)][^()]*)* # [<1 level of nested par.>]
- )? # ]
- [)] # )
- )
- (.*)$ # $4 [<rest of main title>]
- /xi)
+ if ($ar->{link1_type} eq 'artist')
{
- $release->{_name_sort_} = "$1 $4";
- $release->{_disc_no_} = $2;
- $release->{_disc_max_} = $3 || 0;
+ $entity = artistLinkRaw($ar->{link1_name}, $ar->{link1_mbid});
}
+ elsif ($ar->{link1_type} eq 'album')
+ {
+ use MusicBrainz::Server::Controller::Release;
+ $entity = MusicBrainz::Server::Controller::Release::releaseLinkRaw($ar->{link1_name},
+ $ar->{link1_mbid});
+ }
+ elsif ($ar->{link1_type} eq 'url')
+ {
+ use MusicBrainz::Server::Controller::Url;
+ $entity = MusicBrainz::Server::Controller::Url::urlLinkRaw($ar->{link1_name},
+ $ar->{link1_mbid});
+ }
- # Push onto our list of releases we are actually interested in
- push @shortList, $release
- if ($type == MusicBrainz::Server::Release::RELEASE_ATTR_ALBUM ||
- $type == MusicBrainz::Server::Release::RELEASE_ATTR_EP ||
- $type == MusicBrainz::Server::Release::RELEASE_ATTR_COMPILATION ||
- $type == MusicBrainz::Server::Release::RELEASE_ATTR_SINGLE);
+ push @{$currentArGroup->{entities}}, $entity;
}
- if(scalar @shortList)
- {
- @releases = @shortList;
- @releases = sort SortAlbums @releases;
- }
- else
- {
- $c->error("No releases to show");
- }
-
- # Create data structures for the template
- #
# Artist:
$c->stash->{artist} = {
name => $artist->GetName,
- type => MusicBrainz::Server::Artist::GetTypeName($artist->GetType),
+ type => 'artist',
+ mbid => $artist->GetMBId,
+ artist_type => MusicBrainz::Server::Artist::GetTypeName($artist->GetType),
datespan => {
start => $artist->GetBeginDate,
end => $artist->GetEndDate
},
quality => ModDefs::GetQualityText($artist->GetQuality),
resolution => $artist->GetResolution,
- tags => \@tags
+ tags => \@tags,
+ relations => \@prettyArs,
};
# Releases, sorted into "release groups":
@@ -186,6 +197,122 @@
}
}
+sub LoadArtistTags
+{
+ my ($dbh, $tagCount, $artist) = @_;
+
+ my $t = MusicBrainz::Server::Tag->new($dbh);
+ my $tagHash = $t->GetTagHashForEntity('artist', $artist->GetId, $tagCount + 1);
+
+ sort { $tagHash->{$b} <=> $tagHash->{$a}; } keys %{$tagHash};
+}
+
+sub LoadArtistARLinks
+{
+ my ($dbh, $artist) = @_;
+ my @arLinks;
+
+ @arLinks = MusicBrainz::Server::Link->FindLinkedEntities($dbh, $artist->GetId,
+ 'artist', { to_type => ['label', 'url', 'artist'] });
+
+ my $max = scalar(@arLinks);
+ my ($item, $i);
+
+ for($i = 0; $i < $max; $i++)
+ {
+ $item = $arLinks[$i];
+ if ($item->{link0_type} ne 'artist' || $item->{link0_id} != $artist->GetId)
+ {
+ @$item{qw(
+ link0_type link1_type
+ link0_id link1_id
+ link0_name link1_name
+ link0_sortname link1_sortname
+ link0_resolution link1_resolution
+ link_phrase rlink_phrase
+ )} = @$item{qw(
+ link1_type link0_type
+ link1_id link0_id
+ link1_name link0_name
+ link1_sortname link0_sortname
+ link1_resolution link0_resolution
+ rlink_phrase link_phrase
+ )};
+ }
+ }
+
+ sort
+ {
+ my $c = $a->{link_phrase} cmp $b->{link_phrase};
+ return $c if ($c);
+
+ $c = $a->{enddate} cmp $b->{enddate};
+ return $c if ($c);
+
+ $c = $a->{begindate} cmp $b->{begindate};
+ return $c if ($c);
+
+ return $a->{link1_name} cmp $b->{link1_name};
+ } @arLinks;
+}
+
+sub LoadArtistReleases
+{
+ use MusicBrainz::Server::Artist;
+
+ my $artist = shift;
+
+ my @releases = $artist->GetReleases(1, 1);
+ my $onlyHasVAReleases = (scalar @releases) == 0;
+
+ my @shortList;
+
+ for my $release (@releases)
+ {
+ my ($type, $status) = $release->GetReleaseTypeAndStatus;
+
+ # Construct values to sort on
+ $release->SetMultipleTrackArtists($release->GetArtist != $release->GetId() ? 1 : 0);
+ $release->{_is_va_} = ($release->GetArtist == &ModDefs::VARTIST_ID or
+ $release->GetArtist != $release->GetId());
+ $release->{_is_nonalbum_} = ($type == MusicBrainz::Server::Release::RELEASE_ATTR_NONALBUMTRACKS);
+ $release->{_section_key_} = ($release->{_is_va_} . " " . $type);
+ $release->{_name_sort_} = lc decode "utf-8", $release->GetName;
+ $release->{_disc_max_} = 0;
+ $release->{_disc_no_} = 0;
+ $release->{_firstreleasedate_} = ($release->GetFirstReleaseDate || "9999-99-99");
+
+ CheckAttributes($release);
+
+ # Attempt to sort "disc x [of y]" correctly
+ if ($release->{_name_sort_} =~
+ /^(.*) # $1 <main title>
+ (?:[(]disc\ (\d+) # $2 (disc x
+ (?:\ of\ (\d+))? # $3 [of y]
+ (?::[^()]* # [: <disc title>
+ (?:[(][^()]*[)][^()]*)* # [<1 level of nested par.>]
+ )? # ]
+ [)] # )
+ )
+ (.*)$ # $4 [<rest of main title>]
+ /xi)
+ {
+ $release->{_name_sort_} = "$1 $4";
+ $release->{_disc_no_} = $2;
+ $release->{_disc_max_} = $3 || 0;
+ }
+
+ # Push onto our list of releases we are actually interested in
+ push @shortList, $release
+ if ($type == MusicBrainz::Server::Release::RELEASE_ATTR_ALBUM ||
+ $type == MusicBrainz::Server::Release::RELEASE_ATTR_EP ||
+ $type == MusicBrainz::Server::Release::RELEASE_ATTR_COMPILATION ||
+ $type == MusicBrainz::Server::Release::RELEASE_ATTR_SINGLE);
+ }
+
+ sort SortAlbums @shortList;
+}
+
sub CheckAttributes
{
use MusicBrainz::Server::Release;
Added: mb_server/branches/TemplateToolkit/lib/MusicBrainz/Server/Controller/Release.pm
Added: mb_server/branches/TemplateToolkit/lib/MusicBrainz/Server/Controller/Url.pm
Added: mb_server/branches/TemplateToolkit/root/artist/ar-summary.tt
Modified: mb_server/branches/TemplateToolkit/root/artist/header.tt
===================================================================
--- mb_server/branches/TemplateToolkit/root/artist/header.tt 2008-06-30 15:22:07 UTC (rev 9921)
+++ mb_server/branches/TemplateToolkit/root/artist/header.tt 2008-06-30 21:28:51 UTC (rev 9922)
@@ -15,7 +15,7 @@
[% IF artist.resolution %]
<h2>[% artist.resolution %]</h2>
[% END %]
- <h2>Type: [% artist.type %],
+ <h2>Type: [% artist.artist_type %],
[% artist.quality %] data quality</h2>
<div class="links"> Info: [ [% INCLUDE "components/piped-list.tt" list=info_links %] ] </div>
Modified: mb_server/branches/TemplateToolkit/root/artist/landing.tt
===================================================================
--- mb_server/branches/TemplateToolkit/root/artist/landing.tt 2008-06-30 15:22:07 UTC (rev 9921)
+++ mb_server/branches/TemplateToolkit/root/artist/landing.tt 2008-06-30 21:28:51 UTC (rev 9922)
@@ -1,3 +1,4 @@
[% INCLUDE "artist/header.tt" %]
[% INCLUDE "artist/tags.tt" %]
-[% content %]
\ No newline at end of file
+[% INCLUDE "artist/ar-summary.tt" %]
+[% content %]
Modified: mb_server/branches/TemplateToolkit/root/artist/tags.tt
===================================================================
--- mb_server/branches/TemplateToolkit/root/artist/tags.tt 2008-06-30 15:22:07 UTC (rev 9921)
+++ mb_server/branches/TemplateToolkit/root/artist/tags.tt 2008-06-30 21:28:51 UTC (rev 9922)
@@ -1,7 +1,12 @@
<div class="tags">Artist tags:
+ [% IF artist.tags.size %]
<ul>
- [% FOREACH tag IN artist.tags %]
- <li>[% tag %]</li>
- [% END %]
- </ul>
+ [% FOREACH tag IN artist.tags %]
+ <li>[% tag %]</li>
+ [% END %]
+ </ul>
+ [% ELSE %]
+ (none)
+ [% END %]
+ <p><a href="[% c.uri_for('/tags', 'artist', artist.id) %]">Tag this artist</a></p>
</div>
Modified: mb_server/branches/TemplateToolkit/root/components/entity-link.tt
===================================================================
--- mb_server/branches/TemplateToolkit/root/components/entity-link.tt 2008-06-30 15:22:07 UTC (rev 9921)
+++ mb_server/branches/TemplateToolkit/root/components/entity-link.tt 2008-06-30 21:28:51 UTC (rev 9922)
@@ -1,5 +1,6 @@
-[% DEFAULT
- type = 'release'
-%]
-
-<a href="/[% type %]/[% mbid %].html">[% text %]</a>
\ No newline at end of file
+[% IF entity.type == "url" %]
+ <a href="[% entity.url | url %]">[% entity.url | html %]</a>
+ [ <a href="[% c.uri_for('/uri', entity.mbid) %]">info</a> ]
+[% ELSE %]
+ <a href="[% c.uri_for(entity.type, entity.mbid) %]">[% entity.name | html %]</a>
+[% END %]
More information about the MusicBrainz-commits
mailing list