You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
4.4 KiB
JavaScript
128 lines
4.4 KiB
JavaScript
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
|
|
} |