var moment = require('moment'); var Axios = require('axios'); var fs = require('fs-extra') var path = require('path'); const config_api = require('./config'); async function getCommentsForVOD(clientID, vodId) { let url = `https://api.twitch.tv/v5/videos/${vodId}/comments?content_offset_seconds=0`, batch, cursor; let comments = null; try { do { batch = (await Axios.get(url, { headers: { 'Client-ID': clientID, Accept: 'application/vnd.twitchtv.v5+json; charset=UTF-8', 'Content-Type': 'application/json; charset=UTF-8', } })).data; const str = batch.comments.map(c => { let { created_at: msgCreated, content_offset_seconds: timestamp, commenter: { name, _id, created_at: acctCreated }, message: { body: msg, user_color: user_color } } = c; const timestamp_str = moment.duration(timestamp, 'seconds') .toISOString() .replace(/P.*?T(?:(\d+?)H)?(?:(\d+?)M)?(?:(\d+).*?S)?/, (_, ...ms) => { const seg = v => v ? v.padStart(2, '0') : '00'; return `${seg(ms[0])}:${seg(ms[1])}:${seg(ms[2])}`; }); acctCreated = moment(acctCreated).utc(); msgCreated = moment(msgCreated).utc(); if (!comments) comments = []; comments.push({ timestamp: timestamp, timestamp_str: timestamp_str, name: name, message: msg, user_color: user_color }); // let line = `${timestamp},${msgCreated.format(tsFormat)},${name},${_id},"${msg.replace(/"/g, '""')}",${acctCreated.format(tsFormat)}`; // return line; }).join('\n'); cursor = batch._next; url = `https://api.twitch.tv/v5/videos/${vodId}/comments?cursor=${cursor}`; await new Promise(res => setTimeout(res, 300)); } while (cursor); } catch (err) { console.error(err); } return comments; } async function getTwitchChatByFileID(id, type, user_uid, uuid, sub) { let file_path = null; if (user_uid) { if (sub) { file_path = path.join('users', user_uid, 'subscriptions', sub.isPlaylist ? 'playlists' : 'channels', sub.name, id + '.twitch_chat.json'); } else { file_path = path.join('users', user_uid, type, id + '.twitch_chat.json'); } } else { if (sub) { file_path = path.join('subscriptions', sub.isPlaylist ? 'playlists' : 'channels', sub.name, id + '.twitch_chat.json'); } else { file_path = path.join(type, id + '.twitch_chat.json'); } } var chat_file = null; if (fs.existsSync(file_path)) { chat_file = fs.readJSONSync(file_path); } return chat_file; } async function downloadTwitchChatByVODID(vodId, id, type, user_uid, sub) { const twitch_api_key = config_api.getConfigItem('ytdl_twitch_api_key'); const chat = await getCommentsForVOD(twitch_api_key, vodId); // save file if needed params are included let file_path = null; if (user_uid) { if (sub) { file_path = path.join('users', user_uid, 'subscriptions', sub.isPlaylist ? 'playlists' : 'channels', sub.name, id + '.twitch_chat.json'); } else { file_path = path.join('users', user_uid, type, id + '.twitch_chat.json'); } } else { if (sub) { file_path = path.join('subscriptions', sub.isPlaylist ? 'playlists' : 'channels', sub.name, id + '.twitch_chat.json'); } else { file_path = path.join(type, id + '.twitch_chat.json'); } } if (chat) fs.writeJSONSync(file_path, chat); return chat; } module.exports = { getCommentsForVOD: getCommentsForVOD, getTwitchChatByFileID: getTwitchChatByFileID, downloadTwitchChatByVODID: downloadTwitchChatByVODID }