lrcDownloader[typing-tube.net]

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

// ==UserScript==
// @name         lrcDownloader[typing-tube.net]
// @namespace    TyepingTubeLrcDownloader
// @version      1.4
// @description  Typing Tubeの編集画面にlrcファイルのダウンロードリンクを追加します。
// @author       aetenotnk
// @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]).text();

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

    SetDownloadLinkFile(FormatLRC(lyricList));
}

function FormatLRC(lyricList){
    var rowFormat = "[mm:ss.xx]lyric";
    var lines = [];

    for(var i = 0; i < lyricList.length; i++){
        var time = lyricList[i].second;
        var timeParts = time.split(".");
        var mm = ("00" + parseInt(parseInt(time) / 60)).slice(-2);
        var ss = ("00" + (parseInt(time) - mm * 60)).slice(-2);
        var xx = timeParts.length > 1 ? ("00" + timeParts[timeParts.length - 1]).slice(-2) : "00";

        lines.push(
            rowFormat
                .replace("mm", mm)
                .replace("ss", ss)
                .replace("xx", xx)
                .replace("lyric", lyricList[i].lyric));
    }

    return lines.join("\n");
}

CreateDownloadElement();