Greasy Fork is available in English.

lrcDownloaderForNicoTy[typing-tube.net]

Typing Tubeの編集画面にlrcファイルのダウンロードリンクを追加します。

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name         lrcDownloaderForNicoTy[typing-tube.net]
// @namespace    TyepingTubeLrcDownloader
// @version      1.48
// @description  Typing Tubeの編集画面にlrcファイルのダウンロードリンクを追加します。
//                         こちらから転用させていただきました(https://greasyfork.org/en/scripts/391357-lrcdownloader-typing-tube-net)
// @author       aetenotnk, nagisa
// @match        https://typing-tube.net/movie/edit/*
// @grant        none
// ==/UserScript==

function CreateDownloadElement(){
    var editTab = $("#edit");

    if(!editTab.length){
        return false;
    }

    var downloadDiv = $("<div>");
    downloadDiv.addClass("row");
    downloadDiv.addClass("ml-2");
    downloadDiv.addClass("w-100");
    downloadDiv.attr("id", "lrcDownLoader");
    editTab.append(downloadDiv);

    var downloadLink = $("<a>");
    downloadLink.attr("id", "lrcDwonloadLink");
    downloadLink.attr("download", $("#title").attr("value") + ".lrc");
    downloadLink.attr("href", "dummy");
    downloadLink.addClass("col-2");
    downloadLink.text("lrcファイルをダウンロード");
    downloadLink.click(GetLyrics);

    downloadDiv.append(downloadLink);

    return true;
}

function SetDownloadLinkFile(text){
    var downloadLink = $("#lrcDwonloadLink");
    var file = new Blob([text], {type: "text/plain"});
    downloadLink.attr("href", URL.createObjectURL(file));
}

function GetLyrics(){
  var lyrics = $("#subtitles_table > tbody > tr");
    var lyricList = [];

    for(var i = 1; i < lyrics.length - 1; i++){
        var tds = $(lyrics[i]).find("td");
        var time = $(tds[0]).text().replace(" ", "");
        var lyric = tds[1].innerHTML

		const ruby_convert = lyric.match(/<*ruby(?: .+?)?>.*?<*\/ruby*>/g)
		if(ruby_convert){
			for(let v = 0;v<ruby_convert.length;v++){
				const start = ruby_convert[v].indexOf(">")+1
				const end = ruby_convert[v].indexOf("<rt>")
				const ruby = ruby_convert[v].slice(start,end)
				lyric = lyric.replace(ruby_convert[v],ruby)
			}
		}
//        lyric = lyric.replace(/<rt>[^<]*<\/rt>/g, "");
//        lyric = lyric.replace(/<.*>/g, "");

        lyricList.push({
            second: time,
            lyric: lyric
        });
    }

    SetDownloadLinkFile(FormatLRC(lyricList));
}

//@note
//@param time (float)
//タイムタグ文字列に変換
function GetTimeFmt(time){
    var underDot = 1.0 -(Math.ceil(time ) - time);
    if(underDot == 1.0){underDot = 0.0;}
    var naturalNum = time -underDot;

    var mmF = Math.floor(time / 60);
    var ssF = Math.floor(time - mmF * 60);
    var xxF = Math.floor((time - mmF * 60 - ssF) * 100);

    var mm = (mmF >= 10 ? (String(mmF)[0] + String(mmF)[1]) :"0" + String(mmF)[0]);
    var ss = (ssF >= 10 ? (String(ssF)[0] + String(ssF)[1]) :"0" + String(ssF)[0]);
    var xx = (xxF >= 10 ? (String(xxF)[0] + String(xxF)[1]) :"0" + String(xxF)[0]);

    var ret = "[" + mm + ":" + ss + ":" + xx + "]";
    //console.log(ret);
    return ret;
}

function FormatLRC(lyricList){
      var lines = [];

    for(var i = 0; i < lyricList.length; i++){
        //空行なら何もしない-------------------------------
        if(lyricList[i].lyric.length == 0){continue;}
        //start end の時間取得-------------------------------
        var timeS = parseFloat(lyricList[i].second);
        var timeE = parseFloat(lyricList[i + (i === lyricList.length - 1 ? 0 : 1)].second);
        //ブロックに分ける-------------------------------
        //var blocks = lyricList[i].lyric .trim().replace(/ /g," ").split(" ");
        var blocks = lyricList[i].lyric .trim().replace(/ /g," ");

        console.log(blocks);
        //頭の時間タグを挿入----------------------------
        var line = GetTimeFmt(timeS);
//         //時間タグ、ブロックを交互に挿入------------
//         for(var j = 0; j < blocks.length;++j){
//             line += blocks[j];
//             line += " ";
//             line += GetTimeFmt(timeS + (timeE - timeS) * ((j + 1) / blocks.length));
//         }
        //歌詞、お尻の時間タグを挿入
        line += blocks;
        line += GetTimeFmt(timeE);
        lines.push(line);
        //lines.push(GetTimeFmt(timeS) +lyricList[i].lyric +GetTimeFmt(timeE));
    }
    return lines.join("\n");
}

CreateDownloadElement();