Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save salmon-meuniere/bf909d15cd60aa97297db0f1fef1f810 to your computer and use it in GitHub Desktop.
Save salmon-meuniere/bf909d15cd60aa97297db0f1fef1f810 to your computer and use it in GitHub Desktop.
プチリリ Web歌詞メーカー LRCインポートユーザースクリプト(ブラウザにTamperMonkeyを導入してご利用ください)
// ==UserScript==
// @name PetitLyrics Web Maker LRC Import
// @namespace http://tampermonkey.net/
// @version 0.1
// @author Salmon Meuniere
// @match https://petitlyrics.com/mypage/maker/line_input*
// @description プチリリのWeb版の同期歌詞メーカーで、LRC形式を扱えるようになるスクリプトです。
// @grant none
// ==/UserScript==
function parseLRC(txt) {
var lines = txt.split(/\r\n|\n/);
var times = [];
var text = '';
for(var i = 0; i < lines.length; i++) {
var e = lines[i];
var timeExp = /\[(\d{2,})\:(\d{2})[\:|\.](\d{2,3})?\]/;
if (e.match(/^[\s]*$/) === null) {
var time = timeExp.exec(e);
if(time === null) {
alert('LRCファイルの形式が正しくありません');
return false;
} else {
var ms;
var g = time[3].toString();
if(g.length == 2) {
ms = g + '0';
} else if(g.length == 3) {
ms = g;
} else {
ms = g;
}
ms = parseFloat(ms);
times[i] = {};
times[i].min = parseInt(time[1]);
times[i].sec = parseInt(time[2]);
times[i].msec = ms;
text += e.replace(timeExp, '').replace(/(^\s*|\s*$)/m, '') + "\n";
}
}
}
return [text, times];
}
var audio = document.getElementById('myMusic');
var cp = document.getElementById('main_window2');
cp.insertAdjacentHTML('afterend', '<div id="plHelperInsert" style="margin-top: 1.2rem;"><p><b>•LRC読込(テキスト部分半角32, 全角16文字以内)</b><br><b>読み込み後、自動入力を開始します。途中でほかの操作を行わないでください。</b><br>先に音楽を読み込んでください</p><div style="width: 100%"> <input type="file" accept="*.lrc" name="plHplrc" id="plHplrc" disabled> </div></div>');
var mf = document.getElementById('musicfile');
var lrcInput = document.getElementById('plHplrc');
var lyricsTextInput = document.getElementById('lyricsfileConv');
var lyricsTextReload = document.getElementsByName('lyricsfileConvBtn')[0];
mf.addEventListener('change', function(){
lrcInput.removeAttribute('disabled');
lrcInputReload.removeAttribute('disabled');
});
lrcInput.addEventListener('change', function(){
var file = this.files;
var reader = new FileReader();
try{
reader.readAsText(file[0]);
reader.addEventListener('load', function(){
var rsl = this.result;
var lrcArray = parseLRC(rsl);
console.log(lrcArray);
var res = lrcArray[0];
lyricsTextInput.setAttribute("disabled", "disabled");
lyricsTextReload.setAttribute("disabled", "disabled");
try{
//プチリリのコードを拝借
var line_no = 0;
var lyrics_text = res;
var lyrics_text_array = lyrics_text.split('\n');
lyrics_text_array.map(function(readline) {
line_no++;
if(getByte($.trim(readline)) > 32){
alert(String(line_no) + "行目が32バイトを超えています");
return;
}
});
clearRow();
line_no = 0;
lyrics_text_array.map(function(readline) {
line_no++;
var tmpData = {
line_no: line_no,
start_time: "",
lyrics_text: $.trim(readline)
};
$("#list").addRowData(undefined, tmpData);
});
//ラジオボタンを先頭に移動
document.getElementById("rbtn" + String(1)).checked = true;
//先頭の行IDを取得
var rowid = getRowID(1);
//現在行を先頭に移動
$("#list").jqGrid('setSelection', rowid);
//プチリリここまで
document.getElementById("setStartTimeBtn").setAttribute("disabled", "disabled");
alert("読み込みが完了しました。\nOKを押すと、開始します。\n音源コントローラーには触れないでください。");
for(var i = 0; i < lrcArray[1].length; i++) {
var timeD = lrcArray[1][i];
var ct = ((timeD.min)*60) + timeD.sec + (timeD.msec/1000) + 0.1; //0.1秒、プチリリ側で補正が入っている
console.log(ct);
audio.currentTime = ct;
setStartTime();
}
alert("完了しました。");
audio.currentTime = 0;
} catch(e) {
alert("予期せぬエラーが発生しました。");
console.log(e);
}
});
} catch(e){
alert("予期せぬエラーが発生しました。");
console.log(e);
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment