2017-11-11 01:28:11 +00:00
// ==UserScript==
2015-07-18 20:59:15 +00:00
// @name Display shortcut for relationships on MusicBrainz
// @description Display icon shortcut for relationships of release-group, release, recording and work: e.g. Amazon, Discogs, Wikipedia, ... links. This allows to access some relationships without opening the entity page.
2020-03-31 09:56:56 +00:00
// @version 2020.3.31.1
2015-07-18 20:59:15 +00:00
// @author Aurelien Mino <aurelien.mino@gmail.com>
// @licence GPL (http://www.gnu.org/copyleft/gpl.html)
// @downloadURL https://raw.github.com/murdos/musicbrainz-userscripts/master/mb_relationship_shortcuts.user.js
// @updateURL https://raw.github.com/murdos/musicbrainz-userscripts/master/mb_relationship_shortcuts.user.js
// @include http*://*musicbrainz.org/artist/*
// @include http*://*musicbrainz.org/release-group/*
// @include http*://*musicbrainz.org/label/*
2017-11-11 01:28:11 +00:00
// @require https://code.jquery.com/jquery-3.2.1.min.js
2015-07-18 20:59:15 +00:00
// ==/UserScript==
// Definitions: relations-type and corresponding icons we are going to treat
var relationsIconsURLs = {
2018-11-20 22:18:49 +00:00
url : {
'amazon asin' : 'https://musicbrainz.org/static/images/favicons/amazon-32.png' ,
discogs : 'https://musicbrainz.org/static/images/favicons/discogs-32.png' ,
wikidata : 'https://musicbrainz.org/static/images/favicons/wikidata-32.png' ,
imdb : 'https://musicbrainz.org/static/images/favicons/imdb-32.png' ,
'creative commons licensed download' : 'http://creativecommons.org/favicon.ico' ,
'cover art link' : 'http://www.cdcovers.cc/favicon.ico' ,
secondhandsongs : 'https://musicbrainz.org/static/images/favicons/secondhandsongs-32.png' ,
lyrics : 'http://www.nomy.nu/img/lyrics-icon.gif' ,
2020-04-05 14:01:21 +00:00
allmusic : 'https://musicbrainz.org/static/images/favicons/allmusic-16.png' ,
2015-07-18 20:59:15 +00:00
} ,
'release-group' : {
2020-04-05 14:01:21 +00:00
'single from' : 'http://www.amaesingtools.com/images/left_arrow_icon.gif' ,
2015-07-18 20:59:15 +00:00
} ,
2018-11-20 22:18:49 +00:00
release : {
'part of set' : 'http://web.archive.org/web/20060709091901/http://wiki.musicbrainz.org/-/musicbrainz/img/moin-inter.png' ,
2020-04-05 14:01:21 +00:00
remaster : 'http://web.archive.org/web/20060708200714/http://wiki.musicbrainz.org/-/musicbrainz/img/moin-www.png' ,
} ,
2015-07-18 20:59:15 +00:00
} ;
2017-11-12 02:01:52 +00:00
var otherDatabasesIconURLs = {
2018-11-20 22:18:49 +00:00
'd-nb.info' : 'https://musicbrainz.org/static/images/favicons/dnb-16.png' ,
'www.musik-sammler.de' : 'https://musicbrainz.org/static/images/favicons/musiksammler-32.png' ,
'www.worldcat.org' : 'https://musicbrainz.org/static/images/favicons/worldcat-32.png' ,
2020-04-05 14:01:21 +00:00
'rateyourmusic.com' : 'https://musicbrainz.org/static/images/favicons/rateyourmusic-32.png' ,
2017-11-12 02:01:52 +00:00
} ;
2015-07-18 20:59:15 +00:00
var incOptions = {
2018-11-20 22:18:49 +00:00
'release-group' : [ 'release-group-rels' , 'url-rels' ] ,
release : [ 'release-rels' , 'url-rels' , 'discids' ] ,
recording : [ 'work-rels' ] ,
2020-04-05 14:01:21 +00:00
work : [ 'url-rels' ] ,
2015-07-18 20:59:15 +00:00
} ;
// prevent JQuery conflicts, see http://wiki.greasespot.net/@grant
this . $ = this . jQuery = jQuery . noConflict ( true ) ;
if ( ! unsafeWindow ) unsafeWindow = window ;
2020-04-05 14:01:21 +00:00
$ ( document ) . ready ( function ( ) {
2015-07-18 20:59:15 +00:00
// Get pageType (label or artist)
2018-11-20 22:18:49 +00:00
let parent = { } ;
let child = { } ;
if ( ( m = window . location . href . match ( '/artist/(.{36})[^/]*$' ) ) ) {
2015-07-18 20:59:15 +00:00
parent . type = 'artist' ;
parent . mbid = m [ 1 ] ;
child . type = 'release-group' ;
2018-11-20 22:18:49 +00:00
} else if ( ( m = window . location . href . match ( '/(release-group|label)/(.{36})[^/]*$' ) ) ) {
2015-07-18 20:59:15 +00:00
parent . type = m [ 1 ] ;
parent . mbid = m [ 2 ] ;
child . type = 'release' ;
2018-11-20 22:18:49 +00:00
} else if ( ( m = window . location . href . match ( '/artist/(.{36})/(releases|recordings|works)' ) ) ) {
2015-07-18 20:59:15 +00:00
parent . type = 'artist' ;
parent . mbid = m [ 1 ] ;
child . type = m [ 2 ] . replace ( /s$/ , '' ) ;
} else {
// Not supported
return ;
}
2018-11-20 22:18:49 +00:00
let mbidRE = /(release|release-group|work)\/([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/ ;
2015-07-18 20:59:15 +00:00
// Determine target column
2018-11-20 22:18:49 +00:00
let columnindex = 0 ;
2020-04-05 14:01:21 +00:00
$ ( "table.tbl tbody tr[class!='subh']" ) . each ( function ( ) {
2018-11-20 22:18:49 +00:00
$ ( this )
. children ( 'td' )
2020-04-05 14:01:21 +00:00
. each ( function ( ) {
if ( $ ( this ) . find ( 'a' ) . attr ( 'href' ) !== undefined && $ ( this ) . find ( 'a' ) . attr ( 'href' ) . match ( mbidRE ) ) {
2018-11-20 22:18:49 +00:00
return false ;
}
columnindex ++ ;
} ) ;
2015-07-18 20:59:15 +00:00
return false ;
} ) ;
// Set MBID to row in tables to get easiest fastest access
2020-04-05 14:01:21 +00:00
$ ( "table.tbl tr[class!='subh']" ) . each ( function ( ) {
2018-11-20 22:18:49 +00:00
let $tr = $ ( this ) ;
$tr . children ( ` th:eq( ${ columnindex } ) ` ) . after ( "<th style='width: 150px;'>Relationships</th>" ) ;
$tr . children ( ` td:eq( ${ columnindex } ) ` ) . after ( "<td class='relationships'></td>" ) ;
$ ( this )
. find ( 'a' )
2020-04-05 14:01:21 +00:00
. each ( function ( ) {
2018-11-20 22:18:49 +00:00
let href = $ ( this ) . attr ( 'href' ) ;
if ( ( m = href . match ( mbidRE ) ) ) {
$tr . attr ( 'id' , m [ 2 ] ) ;
return false ;
}
} ) ;
2015-07-18 20:59:15 +00:00
} ) ;
2020-03-31 09:56:56 +00:00
// Adapt width of subheader rows by incrementing the colspan of a cell
$ ( "table.tbl tr.subh" ) . each ( function ( ) {
$ ( this ) . children ( "th[colspan]" ) . attr ( 'colspan' , function ( index , oldValue ) {
if ( index === 0 ) {
return Number ( oldValue ) + 1 ;
} else {
return oldValue ;
}
} ) ;
} ) ;
2017-04-16 20:07:25 +00:00
// Calculate offset for multi-page lists
2018-11-20 22:18:49 +00:00
let page = 1 ;
if ( ( m = window . location . href . match ( '[?&]page=([0-9]*)' ) ) ) {
2017-11-11 01:28:11 +00:00
page = m [ 1 ] ;
2017-04-16 20:07:25 +00:00
}
2018-11-20 22:18:49 +00:00
let offset = ( page - 1 ) * 100 ;
2017-11-11 01:28:11 +00:00
2015-07-18 20:59:15 +00:00
// Call the MB webservice
2018-11-20 22:18:49 +00:00
let url = ` /ws/2/ ${ child . type } ? ${ parent . type } = ${ parent . mbid } &inc= ${ incOptions [ child . type ] . join ( '+' ) } &limit=100&offset= ${ offset } ` ;
2017-11-11 01:28:11 +00:00
//console.log("MB WS url: " + url);
2015-07-18 20:59:15 +00:00
2020-04-05 14:01:21 +00:00
$ . get ( url , function ( data , textStatus , jqXHR ) {
2015-07-18 20:59:15 +00:00
// Parse each child
2018-11-20 22:18:49 +00:00
$ ( data )
. find ( child . type )
2020-04-05 14:01:21 +00:00
. each ( function ( ) {
2018-11-20 22:18:49 +00:00
let mbid = $ ( this ) . attr ( 'id' ) ;
// URL relationships
$ ( this )
. find ( "relation-list[target-type='url'] relation" )
2020-04-05 14:01:21 +00:00
. each ( function ( ) {
2018-11-20 22:18:49 +00:00
let reltype = $ ( this ) . attr ( 'type' ) ;
2020-04-05 14:01:21 +00:00
let target = $ ( this ) . children ( 'target' ) . text ( ) ;
2020-03-14 00:43:40 +00:00
if ( Object . prototype . hasOwnProperty . call ( relationsIconsURLs . url , reltype ) ) {
2018-11-20 22:18:49 +00:00
$ ( ` # ${ mbid } td.relationships ` ) . append (
` <a href=' ${ target . replace ( /'/g , ''' ) } '> ` +
` <img style='max-height: 16px;' src=' ${ relationsIconsURLs . url [ reltype ] } ' /> ` +
` </a> `
) ;
} else
for ( let rel in otherDatabasesIconURLs ) {
if ( target . indexOf ( rel ) != - 1 ) {
$ ( ` # ${ mbid } td.relationships ` ) . append (
` <a href=' ${ target . replace ( /'/g , ''' ) } '> ` +
` <img style='max-height: 16px;' src=' ${ otherDatabasesIconURLs [ rel ] } ' /> ` +
` </a> `
) ;
}
}
} ) ;
// Other relationships
$ ( this )
. find ( "relation-list[target-type!='url']" )
2020-04-05 14:01:21 +00:00
. each ( function ( ) {
let targettype = $ ( this ) . attr ( 'target-type' ) . replace ( 'release_group' , 'release-group' ) ;
2018-11-20 22:18:49 +00:00
let relations = { } ;
if ( relationsIconsURLs [ targettype ] === undefined ) {
return ;
}
$ ( this )
. children ( 'relation' )
2020-04-05 14:01:21 +00:00
. each ( function ( ) {
2018-11-20 22:18:49 +00:00
let reltype = $ ( this ) . attr ( 'type' ) ;
2020-04-05 14:01:21 +00:00
let target = $ ( this ) . children ( 'target' ) . text ( ) ;
2018-11-20 22:18:49 +00:00
let url = targettype == 'url' ? target : ` / ${ targettype } / ${ target } ` ;
2020-03-14 00:43:40 +00:00
if ( Object . prototype . hasOwnProperty . call ( relationsIconsURLs [ targettype ] , reltype ) ) {
if ( ! Object . prototype . hasOwnProperty . call ( relations , reltype ) ) relations [ reltype ] = [ url ] ;
2018-11-20 22:18:49 +00:00
else relations [ reltype ] . push ( url ) ;
}
} ) ;
2020-04-05 14:01:21 +00:00
$ . each ( relations , function ( reltype , urls ) {
2018-11-20 22:18:49 +00:00
let html = '' ;
if ( urls . length < - 1 ) {
html += ` <img src=' ${ relationsIconsURLs [ targettype ] [ reltype ] } ' />( ${ urls . length } ) ` ;
} else {
2020-04-05 14:01:21 +00:00
$ . each ( urls , function ( index , url ) {
2018-11-20 22:18:49 +00:00
html += ` <a href=' ${ url } '><img src=' ${ relationsIconsURLs [ targettype ] [ reltype ] } ' /></a> ` ;
} ) ;
}
$ ( ` # ${ mbid } td.relationships ` ) . append ( html ) ;
2015-07-18 20:59:15 +00:00
} ) ;
2018-11-20 22:18:49 +00:00
} ) ;
2015-07-18 20:59:15 +00:00
} ) ;
} ) ;
} ) ;