[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