-
Notifications
You must be signed in to change notification settings - Fork 90
Expand file tree
/
Copy pathlastfm-export.js
More file actions
123 lines (104 loc) · 2.77 KB
/
Copy pathlastfm-export.js
File metadata and controls
123 lines (104 loc) · 2.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// make a request to lastFM
function lastFM(data, callback){
return reqwest({
url:"https://ws.audioscrobbler.com/2.0/",
data: data,
type: 'xml',
success: function(data){
if(callback){callback(false, data)}
},
error: function(err){
if(callback){callback(err)}
}
})
}
// generate data for a request
function requestData(api_key, user, page){
return {
method:'user.getrecenttracks',
user:user,
api_key:api_key,
limit:200,
page: page || 1
}
}
// generate a list of request data objects
function requestList(api_key, user, page_count){
var requests = [];
for(var page = 1; page <= page_count; page++){
requests.push(requestData(api_key, user, page))
}
return requests
}
// extract the data from the xml response
function extractTracks(doc){
// probably nicer ways to do this
var arr = [];
var track, obj, child;
var tracks = doc.evaluate('lfm/recenttracks/track', doc, null, XPathResult.ANY_TYPE, null)
while (track = tracks.iterateNext()){
obj = {};
for (var i = track.childNodes.length - 1; i >= 0; i--) {
child = track.childNodes[i];
obj[child.tagName] = child.textContent;
if (child.tagName) {
var mbid = child.getAttribute('mbid');
if (mbid) {
obj[`${child.tagName}_mbid`] = mbid;
}
}
};
arr.push(obj)
}
return arr;
}
function extractPageCount(doc){
var recenttracks = doc.evaluate('lfm/recenttracks', doc, null, XPathResult.ANY_TYPE, null).iterateNext()
return parseInt(recenttracks.getAttribute('totalPages'), 10)
}
// pull out a row of keys
function row(keys, obj){
return keys.map(function(k){
return obj[k]
})
}
// create a csv row from an array
function csv(array){
// this is not a world class csv generator
return array.map(function(item){
return typeof(item) === 'string' ?
item.replace(/[\",]/g,'') :
item;
}).join(',')
}
// delay a function by millis
function delay(fn, millis){
return function(){
var args = [].slice.call(arguments);
setTimeout.apply(this, [fn,millis].concat(args));
}
}
/*
var output = [];
// find the page count
lastFM(requestData(key, username))
.then(extractPageCount)
.then(function(page_count){
// request all pages
requestList(key, username, page_count)
// .slice(0,30) // actually only 5
.forEach(function(r,i){
setTimeout(function(){
lastFM(r)
.then(extractTracks)
.then(function(tracks){
console.log('.')
// output[0].map(function(d){return row(['artist', 'name', 'date'], d)}).map(csv).join('\n')
output[i] = new Blob([tracks.map(function(d){return row(['artist', 'name', 'date'], d)}).map(csv).join('\n'),'\n'])
})
}, i * 1000)
})
})
// b = new Blob(output, {type: 'text/csv'})
// saveAs(b)
*/