| @@ -2,6 +2,9 @@ | |||
| let videoId; | |||
| let lastVideoId; | |||
| let comments = []; | |||
| let commentFontSize = ''; | |||
| let commentFontPos = ''; | |||
| let commentColour = ''; | |||
| const noon = new Audio ('//nizika.tv/assets/noon.wav'); | |||
| @@ -13,6 +16,10 @@ return (([m, s]) => m * 60 + (+s)) (time.split (':')); | |||
| setInterval (() => { | |||
| const sendBtn = document.getElementById ('niconico-comment-send'); | |||
| const comBox = document.getElementById ('niconico-comment-input'); | |||
| const overlay = document.getElementById ('comment-overlay'); | |||
| const dialog = document.getElementById ('comment-dialog'); | |||
| const styleSize = document.getElementById ('comment-place'); | |||
| const changeColour = document.getElementById ('comment-color'); | |||
| const sendComment = () => | |||
| { | |||
| @@ -37,9 +44,24 @@ comBox.value = ''; | |||
| noon.play (); | |||
| }, 100); | |||
| }; | |||
| if (sendBtn == null || comBox == null) | |||
| if (sendBtn == null || comBox == null || styleSize == null /*|| changeColour == null*/) | |||
| return; | |||
| styleSize.addEventListener ('click', e => | |||
| { | |||
| console.log (1) | |||
| overlay.style.display = 'block'; | |||
| dialog.style.display = 'block'; | |||
| }); | |||
| document.getElementById('okButton').addEventListener('click', function() { | |||
| const form = document.getElementById('dialogForm'); | |||
| const formData = new FormData(form); | |||
| commentFontPos = formData.get('position'); | |||
| commentFontSize = formData.get('size'); | |||
| closeDialog(); | |||
| }); | |||
| comBox.addEventListener ('keydown', | |||
| function (e) | |||
| { | |||
| @@ -74,23 +96,57 @@ canvas.height = 720; | |||
| const ctx = canvas?.getContext ('2d'); | |||
| if (ctx) | |||
| { | |||
| ctx.font = '48px Arial'; // フォントサイズとフォントタイプを設定 | |||
| ctx.textBaseline = 'top' | |||
| ctx.clearRect(0, 0, canvas.width, canvas.height); | |||
| ctx.lineWidth = 4; | |||
| const curTime = document.querySelector ('video').currentTime | |||
| const curTime = document.querySelector ('video').currentTime; | |||
| const duration = document.querySelector ('video').duration; | |||
| comments.forEach ((e, i) => | |||
| { | |||
| [['black', 'strokeText'], ['white', 'fillText']].forEach (([cl, f]) => | |||
| const styles = e.style.split (/\s+/); | |||
| const colorStyles = styles.filter (style => style[0] === '#'); | |||
| const color = colorStyles[0] ?? 'white'; | |||
| if (styles.includes ('large')) | |||
| ctx.font = '96px Arial'; | |||
| else if (styles.includes ('small')) | |||
| ctx.font = '24px Arial'; | |||
| else | |||
| ctx.font = '48px Arial'; // フォントサイズとフォントタイプを設定 | |||
| [['black', 'strokeText'], [color, 'fillText']].forEach (([cl, f]) => | |||
| { | |||
| ctx.fillStyle = cl; | |||
| ctx[f] (e.content, canvas.width + (e.time - curTime - 1) * (canvas.width + e.content.length * 48) / 4, 6 + 60 * (i % 12)); | |||
| if (styles.includes ('top')) | |||
| e.time <= curTime && curTime < e.time + 4 && ctx[f] (e.content, (canvas.width - e.content.length * parseInt (ctx.font)) / 2, 0); | |||
| else if (styles.includes ('bottom')) | |||
| e.time <= curTime && curTime < e.time + 4 && ctx[f] (e.content, (canvas.width - e.content.length * parseInt (ctx.font)) / 2, canvas.height - parseInt (ctx.font)); | |||
| else | |||
| { | |||
| ctx[f] (e.content, canvas.width + (Math.min (e.time, duration - 2) - curTime - 1) * (canvas.width + e.content.length * 48) / 5, 6 + 60 * (i % 12)); | |||
| } | |||
| }); | |||
| }); | |||
| } | |||
| let cmtStyle; | |||
| if ((cmtStyle = document.querySelector ('.comment-threads')?.parentElement?.style) != null) | |||
| cmtStyle.display = 'none'; | |||
| cmtStyle.display = 'none'; | |||
| let pos = document.querySelector ('#comment-place') | |||
| let cl = document.querySelector ('#comment-color') | |||
| if (pos) pos.style.display = 'none'; | |||
| if (cl) cl.style.display = 'none' | |||
| }, 30); | |||
| setInterval (() => | |||
| { | |||
| let video = document.querySelector ('video'); | |||
| video?.parentElement.insertBefore (document.querySelector ('#comment-layer'), video.nextElementSibling); | |||
| }, 1000); | |||
| function closeDialog() { | |||
| document.getElementById('comment-overlay').style.display = 'none'; | |||
| document.getElementById('comment-dialog').style.display = 'none'; | |||
| }let videoId; | |||
| ``` | |||