Playing with the raw XML API with XSL and trying to manage bootlegs

Hi,

I’ve been running into a limit for how to display a list of bootleg releases for a specific artist, but to then be able to view with columns for ‘recorded at’ being either a place, event, or area. I’ve been experimenting with raw calls to the API and processing the view of the XML using an XSL template. My Fu isn’t very good, but this is what I’ve come up with so far

Save as releases.xsl

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:mb="http://musicbrainz.org/ns/mmd-2.0#">
  <xsl:output method="html"/>
  <xsl:template match="/">
    <html>
    <body>
    <h2>MusicBrainz release decoder test by davygrvy@pobox.com</h2>
    Count is <xsl:value-of select="mb:metadata/mb:release-list/@count" /><br/>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Title</th>
        <th>Status</th>
        <th>Attributes</th>
        <th>Date</th>
        <th>Place</th>
        <th>Disambig</th>
      </tr>
      <xsl:for-each select="mb:metadata/mb:release-list/mb:release">
        <tr>
          <td><a href="https://musicbrainz.org/release/{@id}"><xsl:value-of select="mb:title"/></a></td>
          <td><xsl:value-of select="mb:status"/></td>
          <td><xsl:value-of select="mb:release-group/mb:primary-type"/> + <xsl:value-of select="mb:release-group/mb:secondary-type-list/mb:secondary-type"/></td>
          <xsl:if test="not(mb:relation-list)">
             <td>[no data]</td>
             <td>[no data]</td>
          </xsl:if>
          <xsl:for-each select="mb:relation-list/mb:relation">           
             <!-- TODO: use 'credited as' below when spec'd -->
             <xsl:choose>
                <xsl:when test="@type-id='4dda6e40-14af-46bb-bb78-ea22f4a99dfa'">
  		   <!-- 'recorded at' for event, but we can't see 'held in/at', so display name with link to event -->
  		   <td><xsl:value-of select="mb:event/mb:life-span/mb:begin"/></td>
  		   <td><a href="https://musicbrainz.org/event/{mb:event/@id}"><xsl:value-of select="mb:event/mb:name"/></a></td>
	        </xsl:when>
                <xsl:when test="@type-id='3b1fae9f-5b22-42c5-a40c-d1e5c9b90251'">
  		   <!-- 'recorded at' for place -->
  		   <td><xsl:value-of select="mb:begin"/></td>
  		   <td><xsl:value-of select="mb:place/mb:name"/></td>
	        </xsl:when>
                <xsl:when test="@type-id='354043e1-bdc2-4c7f-b338-2bf9c1d56e88'">
  		   <!-- 'recorded in' for area -->
  		   <td><xsl:value-of select="mb:begin"/></td>
  		   <td><xsl:value-of select="mb:area/mb:name"/></td>
	        </xsl:when>
	     </xsl:choose>
          </xsl:for-each>    
          <td><xsl:value-of select="mb:disambiguation"/></td>
        </tr>
      </xsl:for-each>    
    </table>
    </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

I call it from the command line with this

davygrvy@puukukui:~/PlayBox/MB stuff$ wget -O - https://musicbrainz.org/ws/2/release?artist=678d88b2-87b0-403b-b63d-5da7465aecc3\&status=bootleg\&type=live\&inc=release-groups+place-rels+event-rels\&limit=25\&offset=850 |xsltproc -o releases.html releases.xsl -; google-chrome releases.html

I get a view like this

My formatting stinks (thus far) for multiple locations, but I’m getting what I need. I can see releases with disambigs, but no formal place or concert event relationships and even ones with nothing. This is showing the work I need to do for creating concert events in my templated series. I’m about a quarter done converting the whole thing :slight_smile:

2 Likes

To explain the issue I’m having a bit different.. When we have a list of releases such as this, I need columns for date and place of the performance if live (probably a bootleg too). My quicky xsl template above does this and I am happy for my need. But I wish the website would give us these columns to help out us bootleggers

this is working better. save as releases.xsl

<?xml version="1.0"?>
<!--

Call this from the commandline like this:
wget -O - https://musicbrainz.org/ws/2/release?artist=678d88b2-87b0-403b-b63d-5da7465aecc3\&status=bootleg\&type=live\&inc=release-groups+place-rels+event-rels\&limit=25\&offset=0 |xsltproc -o releases.html releases.xsl -; google-chrome releases.html

-->
<xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:mb="http://musicbrainz.org/ns/mmd-2.0#">
  <xsl:output method="html"/>
  <xsl:template match="/">
    <html>
    <body>
    <h2>MusicBrainz release decoder test by davygrvy@pobox.com</h2>
    Count is <xsl:value-of select="mb:metadata/mb:release-list/@count" /><br/>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Title</th>
        <th>Status</th>
        <th>Attributes</th>
        <th>Performance</th>
        <th>Disambig</th>
      </tr>
      <xsl:for-each select="mb:metadata/mb:release-list/mb:release">
        <tr>
          <td><a href="https://musicbrainz.org/release/{@id}"><xsl:value-of select="mb:title"/></a></td>
          <td><xsl:value-of select="mb:status"/></td>
          <td><xsl:value-of select="mb:release-group/mb:primary-type"/> + <xsl:value-of select="mb:release-group/mb:secondary-type-list/mb:secondary-type"/></td>
          <xsl:choose>
             <xsl:when test="not(mb:relation-list)">
                <td>[no data]</td>
             </xsl:when>
             <xsl:otherwise>
                <td>
                <xsl:for-each select="mb:relation-list/mb:relation">           
                   <!-- TODO: use 'credited as' below when spec'd -->
                   <xsl:choose>
                      <xsl:when test="@type-id='4dda6e40-14af-46bb-bb78-ea22f4a99dfa'">
                         <!-- 'recorded at' for event, but we can't see 'held in/at', so display name with link to event -->
                         <a href="https://musicbrainz.org/event/{mb:event/@id}"><xsl:value-of select="mb:event/mb:name"/></a>
                         (<xsl:value-of select="mb:event/mb:life-span/mb:begin"/>)<br/>
                      </xsl:when>
                      <xsl:when test="@type-id='3b1fae9f-5b22-42c5-a40c-d1e5c9b90251'">
                         <!-- 'recorded at' for place -->
                         <xsl:value-of select="mb:place/mb:name"/> (<xsl:value-of select="mb:begin"/>)<br/>
                      </xsl:when>
                      <xsl:when test="@type-id='354043e1-bdc2-4c7f-b338-2bf9c1d56e88'">
                         <!-- 'recorded in' for area -->
                         <xsl:value-of select="mb:area/mb:name"/> (<xsl:value-of select="mb:begin"/>)<br/>
                      </xsl:when>
                   </xsl:choose>
                </xsl:for-each>
                </td>
             </xsl:otherwise>
          </xsl:choose>
          <td><xsl:value-of select="mb:disambiguation"/></td>
        </tr>
      </xsl:for-each>    
    </table>
    </body>
    </html>
  </xsl:template>
</xsl:stylesheet>