-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathkirinlyric.js
71 lines (65 loc) · 2.16 KB
/
kirinlyric.js
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
jQuery.fn.kirinlyric = function(conf) {
var cls = '.kirinlyric';
var farPrev = conf.farPrev || 'far-prev';
var prev = conf.prev || 'prev';
var current = conf.current || 'current';
var next = conf.next || 'next';
var farNext = conf.farNext || 'far-next';
var $audio = $(this);
var lrc = parseLRC(conf.lrc);
var $target = $(conf.target).html('<span class="kirinlyric blank-row ' + farPrev + '"></span><span class="kirinlyric blank-row ' + prev + '"></span>');
// generate HTML
var html = [];
$.each(lrc, function(idx, row) {
if (/^raw/.test(row.time)) {
html.push(row.text);
} else {
html.push('<span class="kirinlyric" data-time="' + row.time + '">' + row.text + '<br></span>');
}
});
$target.append(html.join('')).append('<span class="kirinlyric blank-row"></span><span class="kirinlyric blank-row"></span>');
// monitoring
function loop() {
var currentTime = $audio.prop('currentTime');
var $spans = $(cls);
$spans.removeClass(prev).removeClass(current).removeClass(next).removeClass(farPrev).removeClass(farNext).each(function(idx, span) {
var $farPrev = $(($spans[idx - 2]));
var $prev = $(($spans[idx - 1]));
var $span = $(span);
var $next = $(($spans[idx + 1]));
var $farNext = $(($spans[idx + 2]));
var time = $span.data('time');
var nextTime = $next.data('time');
if (currentTime > time && typeof nextTime == 'undefined' || currentTime < nextTime) {
$farPrev.addClass(farPrev);
$prev.addClass(prev);
$span.addClass(current);
$next.addClass(next);
$farNext.addClass(farNext);
return false;
}
});
}
setInterval(loop, 300);
// convert lrc string to object
function parseLRC(lrcStr) {
var lrc = [];
var arr = lrcStr.split(/\r\n|\r|\n/);
$.each(arr, function(idx, row) {
var time = row.match(/^\[(\d{2}):(\d{2})\.(\d{2})\](.*)$/);
if (time && time.length == 5) {
var sec = (Number(time[1]) * 60 + Number(time[2])) + Number(time[3]) / 100;
lrc.push({
time : sec,
text : time[4]
});
} else {
lrc.push({
time : 'raw' + idx,
text : row
});
}
});
return lrc;
}
};