]> git.evergreen-ils.org Git - contrib/Conifer.git/blob - Open-ILS/web/js/ui/default/opac/wikidata_music_card.js
More robust Wikidata entity name lookup
[contrib/Conifer.git] / Open-ILS / web / js / ui / default / opac / wikidata_music_card.js
1 ;(function () {
2   var performer;
3   var entity_name;
4   var note;
5   var wd;
6
7   if (document.getElementById('canvas_main').getAttribute('typeof').indexOf('MusicAlbum') > -1) {
8     performer = document.querySelector('span[resource="#schemacontrib1"] span[property="name"]');
9     entity_name = performer.textContent.trim();
10     var lastchar = entity_name[entity_name.length - 1];
11     if (lastchar === '.' || lastchar === ',') {
12       entity_name = entity_name.slice(0, -1);
13     }
14     var inverse = entity_name.split(',');
15     if (inverse.length === 2) {
16       entity_name = inverse[1].trim() + " " + inverse[0].trim();
17     }
18     note = document.createElement('span');
19     note.innerText = '♪';
20     note.addEventListener('click', perform, { once: true });
21     performer.appendChild(note);
22   }
23
24   function perform(e) {
25     findPerformer(performer, entity_name);
26     e.preventDefault();
27     e.stopPropagation();
28   }
29
30   function toggleMode(el) {
31     wd = document.getElementById('magic_musician');
32     wd.style.display = 'inherit';
33     el.addEventListener('click', toggle);
34   }
35
36   function toggle(e) {
37     wd = document.getElementById('magic_musician');
38     
39     if (wd.style.display === 'inherit') {
40       wd.style.display = 'none';
41     } else {
42       wd.style.display = 'inherit';
43     }
44     e.preventDefault();
45     e.stopPropagation();
46   }
47
48   function findPerformer(performer, entity_name) {
49     var url = 'https://query.wikidata.org/sparql';
50     var query = 'SELECT DISTINCT ?item ?itemLabel ?itemDescription ?image ?website ?songKick WHERE {' +
51         '?item rdfs:label|skos:altLabel|wdt:P1449 "' + entity_name + '"@en . ' +
52         '{ ?item wdt:P31 wd:Q215380 . } ' + // band
53         'UNION ' +
54         '{ ?item wdt:P31 wd:Q5741069 . } ' + // rock band
55         'UNION ' +
56         '{ ?item wdt:P106/wdt:P279* wd:Q639669 . } ' +
57         'OPTIONAL { ?item wdt:P3478 ?songKick . ' +
58         '  ?item wdt:P856 ?website . ' +
59         '  ?item wdt:P18 ?image } . ' +
60         'SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } ' +
61     '} ' +
62     'LIMIT 10';
63     var q = '?query=' + encodeURIComponent(query);
64
65     var req = new window.XMLHttpRequest();
66     req.open('GET', url + q);
67     req.setRequestHeader('Accept', 'application/sparql-results+json');
68     if (req.responseType && (req.responseType = 'json')) {
69       req.onload = function (evt) {
70         var r = req.response.results.bindings[0];
71         if (r !== undefined) {
72           generateCard(performer, r);
73           toggleMode(note);
74           // console.log(r);
75         }
76       }
77     } else {
78       // IE 10/11
79       req.onload = function (evt) {
80         var r = JSON.parse(req.responseText).results.bindings[0];
81         if (r !== undefined) {
82           generateCard(performer, r);
83           toggleMode(note);
84           // console.log(r);
85         }
86       }
87     }
88     req.send();
89   }
90
91   function generateCard(performer, r) {
92     var auth_div = document.querySelector('div[class="rdetail_authors_div"]');
93     var musician = document.createElement('div');
94     musician.id = 'magic_musician';
95     musician.style.padding = '0.5em 1em 1em 1em';
96     musician.style.border = 'thin blue solid';
97     musician.style.overflow = 'hidden';
98
99     if (r.hasOwnProperty('image')) {
100       var img = document.createElement('img');
101       img.src = r.image.value.replace('http:', 'https:');
102       img.style.float = 'left';
103       img.style.width = '150px';
104       img.style['margin-right'] = '1em';
105       musician.appendChild(img);
106     }
107
108     if (r.hasOwnProperty('itemDescription')) {
109       var description = r.itemDescription.value;
110       var wdd = document.createElement('div');
111       var wddl = document.createElement('label');
112       wddl.innerText = description;
113       wdd.appendChild(wddl);
114       musician.appendChild(wdd);
115     }
116
117     var uri = r.item.value;
118     var wd = document.createElement('div');
119     var wdl = document.createElement('label');
120     wdl.innerText = 'Wikidata ID: ';
121     var wdv = document.createElement('a');
122     wdv.href = uri;
123     wdv.innerText = uri.substr(uri.lastIndexOf('/') + 1);
124     wd.appendChild(wdl);
125     wd.appendChild(wdv);
126     musician.appendChild(wd);
127
128     var website = '';
129     if (r.hasOwnProperty('website')) {
130       website = r.website.value;
131       var ws = document.createElement('div');
132       var wsl = document.createElement('label');
133       wsl.innerText = 'Web site: ';
134       var wsv = document.createElement('a');
135       wsv.href = website;
136       wsv.innerText = website;
137       ws.appendChild(wsl);
138       ws.appendChild(wsv);
139       musician.appendChild(ws);
140     }
141
142     var songkick = '';
143     if (r.hasOwnProperty('songKick')) {
144       songkick = 'http://www.songkick.com/artists/' + r.songKick.value;
145       var sk = document.createElement('div');
146       var skl = document.createElement('label');
147       skl.innerText = 'Songkick ID: ';
148       var skv = document.createElement('a');
149       skv.href = songkick;
150       skv.innerText = songkick.substr(songkick.lastIndexOf('/') +1);
151       sk.appendChild(skl);
152       sk.appendChild(skv);
153       musician.appendChild(sk);
154     }
155
156     auth_div.appendChild(musician);
157     document.getElementById('rdetail_image_div').style.clear = 'both';
158   }
159 })()