2023年政策修订增补工作正在进行中,欢迎参与!
  • Moegirl.ICU:萌娘百科流亡社群 581077156(QQ),欢迎对萌娘百科运营感到失望的编辑者加入
  • Moegirl.ICU:账号认领正在试运行,有意者请参照账号认领流程

User:AnnAngela/js/Music163Lrc.js

萌娘百科,万物皆可萌的百科全书!转载请标注来源页面的网页链接,并声明引自萌娘百科。内容不可商用。
跳转到导航 跳转到搜索

注意:在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。

  • Firefox/Safari:按住“Shift”的同时单击“刷新”,或按“Ctrl-F5”或“Ctrl-R”(Mac为“⌘-R”)
  • Google Chrome:按“Ctrl-Shift-R”(Mac为“⌘-Shift-R”)
  • Internet Explorer:按住“Ctrl”的同时单击“刷新”,或按“Ctrl-F5”
  • Opera:在“工具→首选项”中清除缓存
如果您已登录但该页面出现未登录状态,请尝试在地址栏的地址最后添加代码?_=1来访问最新页面。
添加代码后的本页地址如下:-{R|https://moegirl.icu/User:AnnAngela/js/Music163Lrc.js?_=1}-
(function() {
    var tagsRegMap = {
            ti: 'title',
            ar: 'artist',
            al: 'album',
        },
        isLrcLine = function isLrcLine(lrc) {
            return /^\[(\d{2,}):(\d{2})(\.\d{2,3})?\](.*)$|^\[(ti|ar|al):([^\]]*)\]$/g.test(lrc);
        },
        isLoaded = false;

    function parseLrc(lrc) {
        var tags = {},
            lrcs = {},
            times = [],
            result = '';
        lrc.split(/\r*\n/).forEach(function(lrc) {
            if (!isLrcLine(lrc)) return;
            var tag = /^\[(ti|ar|al):([^\]]*)\]$/i.exec(lrc);
            if (tag) {
                tags[tagsRegMap[tag[1]]] = tag[2];
                return;
            }
            var exec = /^\[(\d{2,}):(\d{2})(\.\d{2,3})?\](.*)$/g.exec(lrc);
            if (!exec) return;
            var text = exec[4] || '',
                min = +exec[1],
                sec = +exec[2],
                ms = +exec[3] || 0;
            if (text === '') text = '<break>';
            var time = parseInt((min * 60 + sec + ms) * 1000) + '';
            if (!lrcs[time]) {
                lrcs[time] = text;
                times.push(+time);
            } else lrcs[time] += '\n' + text;
        });
        if (tags.title) {
            result += tags.title;
            if (tags.artist) result += ' - ' + tags.artist;
            if (tags.album) result += ' - ' + tags.album;
        }
        result += '\n<main_break>';
        times.sort(function(a, b) { return a - b });
        times.forEach(function(time) {
            result += '\n' + lrcs[time];
        });
        return result;
    }

    if (["edit", "submit"].includes(mw.config.get("wgAction"))) {
        var c;
        c = setInterval(function() {
            if (!$("#wikiEditor-section-advanced > div.group.group-insert").length) return;
            clearInterval(c);
            $("#wikiEditor-section-advanced > div.group.group-insert").append($("<a/>").addClass("label").css({
                "cursor": "pointer",
                "float": "right",
                "margin-left": "8px",
                "margin-right": "5px",
            }).text("获取网易云音乐翻译歌词").on("click", function() {
                var textbox = $("#wpTextbox1"),
                    start = textbox[0].selectionStart,
                    text = textbox.val(),
                    id = prompt("网易云音乐歌曲ID:");
                if (id === null) return;
                if (isNaN(+id) || +id <= 0 || /\D/.test(id)) return alert('歌曲ID非法!必须为正整数!');
                var url = 'https://moegirlpedia.annangela.cn/music163Lyric?id=' + +id,
                    defaultCursor = $('body').css('cursor');
                $('body').css('cursor', 'wait');
                $.ajax({
                    url: url,
                    type: "GET",
                    error: function() {
                        var info = '';
                        for (var i = 0, l = arguments.length; i < l; i++) info += JSON.stringify(arguments[i]) + '\n';
                        info += '\n出现问题!请截图本内容联系开发人员!';
                        alert(info);
                    },
                    timeout: 60000,
                    success: function(data) {
                        $('body').css('cursor', defaultCursor);
                        if (data.lrc && data.lrc.lyric) {
                            var string = '{{Lyrics';
                            var originLrcText = parseLrc(data.lrc.lyric);
                            string += '\n' + originLrcText.split('<main_break>').map(function(t, i) {
                                if (i === 0) return '|lb-text1=' + t;
                                else return t.split('<break>').map(function(t, i) {
                                    return '\n|lb-text' + (i + 2) + '=' + t.replace(/^\n*/, '');
                                }).join('');
                            }).join('');
                            if (data.tlyric && data.tlyric.lyric) {
                                var translatedLrcText = parseLrc(data.tlyric.lyric);
                                string += '\n' + translatedLrcText.split('<main_break>').map(function(t, i) {
                                    if (i === 0) return '|rb-text1=翻译者:' + data.transUser.nickname + '\n';
                                    else return t.split('<break>').map(function(t, i) {
                                        return '\n|rb-text' + (i + 2) + '=' + t.replace(/^\n*/, '');
                                    }).join('');
                                }).join('');
                            } else {
                                alert("该歌词没有翻译");
                            }
                            string += '\n}}';

                            textbox.val(text.substring(0, start) + "\n" + string.replace(/\n+/g, '\n') + "\n" + text.substring(start));
                            textbox[0].selectionStart = textbox[0].selectionEnd = start + string.length;
                            textbox.focus();
                        } else {
                            alert("你请求的歌曲没有歌词或不存在");
                        }
                    }
                });
            }));
        }, 1000);
    }
})();