| @@ -2,6 +2,9 @@ | |||||
| let videoId; | let videoId; | ||||
| let lastVideoId; | let lastVideoId; | ||||
| let comments = []; | let comments = []; | ||||
| let commentFontSize = ''; | |||||
| let commentFontPos = ''; | |||||
| let commentColour = ''; | |||||
| const noon = new Audio ('//nizika.tv/assets/noon.wav'); | const noon = new Audio ('//nizika.tv/assets/noon.wav'); | ||||
| @@ -13,6 +16,10 @@ return (([m, s]) => m * 60 + (+s)) (time.split (':')); | |||||
| setInterval (() => { | setInterval (() => { | ||||
| const sendBtn = document.getElementById ('niconico-comment-send'); | const sendBtn = document.getElementById ('niconico-comment-send'); | ||||
| const comBox = document.getElementById ('niconico-comment-input'); | 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 = () => | const sendComment = () => | ||||
| { | { | ||||
| @@ -37,9 +44,24 @@ comBox.value = ''; | |||||
| noon.play (); | noon.play (); | ||||
| }, 100); | }, 100); | ||||
| }; | }; | ||||
| if (sendBtn == null || comBox == null) | |||||
| if (sendBtn == null || comBox == null || styleSize == null /*|| changeColour == null*/) | |||||
| return; | 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', | comBox.addEventListener ('keydown', | ||||
| function (e) | function (e) | ||||
| { | { | ||||
| @@ -74,23 +96,57 @@ canvas.height = 720; | |||||
| const ctx = canvas?.getContext ('2d'); | const ctx = canvas?.getContext ('2d'); | ||||
| if (ctx) | if (ctx) | ||||
| { | { | ||||
| ctx.font = '48px Arial'; // フォントサイズとフォントタイプを設定 | |||||
| ctx.textBaseline = 'top' | ctx.textBaseline = 'top' | ||||
| ctx.clearRect(0, 0, canvas.width, canvas.height); | ctx.clearRect(0, 0, canvas.width, canvas.height); | ||||
| ctx.lineWidth = 4; | 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) => | 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.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; | let cmtStyle; | ||||
| if ((cmtStyle = document.querySelector ('.comment-threads')?.parentElement?.style) != null) | 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); | }, 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; | |||||
| ``` | ``` | ||||