Skip to content

Instantly share code, notes, and snippets.

@bazzaar
Last active March 30, 2020 21:25
Show Gist options
  • Save bazzaar/979b6e39f34526b60a697daf74bf1019 to your computer and use it in GitHub Desktop.
Save bazzaar/979b6e39f34526b60a697daf74bf1019 to your computer and use it in GitHub Desktop.
get_musicbrainz_release_groups : browse_vs_lookup syntax
use Cro::HTTP::Client;
use JSON::Fast;
use LibUUID;
use HTTP::API::MusicBrainz;
use Pretty::Table;
my $client = Cro::HTTP::Client.new(
headers => [
User-agent => 'HTTP::API::MusicBrainz/0.0.1'
]);
# ---- focus on 'The Studio Albums : 1968–1979' by 'Mitchell, Joni'.
# ---- Get artist id --------------------------------------------------------
my $api = HTTP::API::MusicBrainz.new();
my %perfect-match = $api.search-artist('Mitchell%2C%20Joni').grep({ $_<score> == 100 }).?first;
# my %perfect-match = $api.search-artist('Joni%20Mitchell').grep({ $_<score> == 100 }).?first;
if (!%perfect-match) {
die "No perfect match for '" ~ %perfect-match<sort-name> ~ "'.";
} else {
say "Matched %perfect-match<sort-name> [%perfect-match<id>]!";
};
# ---- Get Release Groups ( using Cro and Musicbrainz browse syntax ) -------
# https://musicbrainz.org/ws/2/release-group?artist=a6de8ef9-b1a1-4756-97aa-481bbb8a4069
my $url = 'https://musicbrainz.org/ws/2/release-group?artist=' ~ %perfect-match<id> ~ '&limit=100&fmt=json';
my $resp = await $client.get($url); # Make the request, get the search result link
my $json = await $resp.body-text; # Pull the data
my %release-groups-v1 = from-json($json); # Parse the JSON
for %release-groups-v1{'release-groups'}.keys -> $key {
if %release-groups-v1{'release-groups'}[$key]{'primary-type'}.defined == False { %release-groups-v1{'release-groups'}[$key]{'primary-type'} = '' }
}
my $table1 = Pretty::Table.new;
given $table1 {
.add-column('release-date' , %release-groups-v1{'release-groups'}»{'first-release-date'});
.add-column('release-group-MBID', %release-groups-v1{'release-groups'}»{'id'});
.add-column('type-1st' , %release-groups-v1{'release-groups'}»{'primary-type'});
.add-column('title' , %release-groups-v1{'release-groups'}»{'title'});
.add-column('types-2nd' , %release-groups-v1{'release-groups'}»{'secondary-types'});
}
$table1.title(%perfect-match<sort-name> ~ ' : Release Groups');
$table1.align(%(:title<l>,:release-group-MBID<l>));
$table1.sort-by('release-date');
$table1.junction-char('*');
put $table1;
# ---- Get Release Groups ( using HTTP::API::MusicBrainz and MusicBrainz lookup syntax ) -----------------------------------------------------
# https://musicbrainz.org/ws/2/artist/a6de8ef9-b1a1-4756-97aa-481bbb8a4069?inc=release-groups
my %artist-v2 = $api.lookup-artist(UUID.new(%perfect-match<id>), :release-groups);
for %artist-v2{'release-groups'}.keys -> $key {
if %artist-v2{'release-groups'}[$key]{'primary-type'}.defined == False { %artist-v2{'release-groups'}[$key]{'primary-type'} = '' }
}
my @release-groups-v2 = %artist-v2<release-groups>.list;
my $table2 = Pretty::Table.new;
given $table2 {
.add-column('release-date' , @release-groups-v2»{'first-release-date'});
.add-column('release-group-MBID', @release-groups-v2»{'id'});
.add-column('type-1st' , @release-groups-v2»{'primary-type'});
.add-column('title' , @release-groups-v2»{'title'});
.add-column('types-2nd' , @release-groups-v2»{'secondary-types'});
}
$table2.title(%perfect-match<sort-name> ~ ' : Release Groups');
$table2.align(%(:title<l>,:release-group-MBID<l>));
$table2.sort-by('release-date');
$table2.junction-char('*');
put $table2;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment