Добавил еще ведущие нули к миллисекундам, если кому-то еще когда-то этот код понадобится
log = function (text, color, define){ var id, time, thread, logHtml, textLog; define = (typeof define == 'string') ? define.split(/[\s,.|:;]+/g) : define; if(typeof define === 'object' && define !== null){ if(Array.isArray(define)){ id = define.indexOf('id') > -1; time = define.indexOf('time') > -1; thread = define.indexOf('thread') > -1; } else{ id = define.id == true; time = define.time == true; thread = define.thread == true; } } else id = time = thread = true; id = id ? '<a href="action://action' + ScriptWorker.GetCurrentAction() + '" style="color:gray;">[' + ScriptWorker.GetCurrentAction() + ']</a>' : ''; time = time ? ' ' + getTime() : ''; thread = thread ? ' Поток №' + thread_number() : ''; logHtml = (id || time || thread) ? id + '<span style="color: white">' + time + thread + ' : </span>' : ''; logHtml += '<span style="color:' + (color ? color : 'white') + '">' + text + '</span>'; textLog = '[' + ScriptWorker.GetCurrentAction() + ']' + time + thread + ' : ' + text function getTime(){ var checkTime = function(i){ return (i < 10) ? "0" + i : i; }; var checkMilliSeconds = function(ms){ if (ms < 10) { return "00" + ms; } else if (ms < 100) { return "0" + ms; } else { return ms; } }; var d = new Date(); var hh = checkTime(d.getHours()); var mm = checkTime(d.getMinutes()); var ss = checkTime(d.getSeconds()); var ms = checkMilliSeconds(d.getMilliseconds()); return '[' + hh + ':' + mm + ':' + ss + '.' + ms + ']'; }; Logger.WriteHtml(logHtml, textLog); }Почему в всех элементах списка одно и тоже значение?
-
Есть NodeJS код, но почему-то при формировании списка ITOG этот код пишет в каждый элемент списка ITOG, а конкретно в часть элемента где указана "DATA_PUBLISHED" всегда значение "1 month ago" , хотя там должны быть разные значения, например:
"4 days ago" или например "7 weeks ago"А устанавливает он в DATA_PUBLISHED первое найденное значение из текста в переменой SAVED_CONTENT и далее почему-то для других элементов списка ITOG он ставит это первое найденное значение "1 month ago"
Вот структура каждого элемента:
return `${id_of_video}@@@${views}^^^${views_per_hour}~~~${it_is_short_or_not}↜↜↜${name_of_video}&&&seconds${seconds}***DATA_PUBLISHED${DATA_PUBLISHED}`;Код:
const jsdom = require("jsdom"); const { JSDOM } = jsdom; var SAVED_CONTENT = [[SAVED_CONTENT]]; function convertViews(savedContent) { savedContent = savedContent.replace(/"accessibilityData":\{"label":"([\d.]+)\s*([KkMm]|million)?\s*views"\}\},"simpleText":"([\d.]+)\s*([KkMm]|million)?\s*views"/g, function (match, num1, unit1, num2, unit2) { var multiplier1 = unit1 === 'M' || unit1 === 'm' || unit1 === 'million' ? 1000000 : unit1 === 'K' || unit1 === 'k' ? 1000 : 1; var multiplier2 = unit2 === 'M' || unit2 === 'm' || unit2 === 'million' ? 1000000 : unit2 === 'K' || unit2 === 'k' ? 1000 : 1; var views1 = Math.round(parseFloat(num1) * multiplier1); var views2 = Math.round(parseFloat(num2) * multiplier2); return '"accessibilityData":{"label":"' + views1 + ' views"}},"simpleText":"' + views2 + ' views"'; }); savedContent = savedContent.replace(/"viewCountText":\{"simpleText":"([\d,]+)\s*views"\}/g, function (match, num) { var views = parseInt(num.replace(/,/g, ''), 10); return '"viewCountText":{"simpleText":"' + views + ' views"}'; }); return savedContent; } SAVED_CONTENT = convertViews(SAVED_CONTENT); [[SAVED_CONTENT]] = SAVED_CONTENT; const dom = new JSDOM(SAVED_CONTENT); const document = dom.window.document; const videoElements = Array.from(document.querySelectorAll("#contents ytd-video-renderer")); function timeTextToHours(timeText) { const regex = /(\d+)\s*(\D+)/g; let hours = 0; let match; while ((match = regex.exec(timeText)) !== null) { const value = parseInt(match[1], 10); const unit = match[2].toLowerCase(); if (unit.includes("minutes") || unit.includes("minute")) { hours += value / 60; } else if (unit.includes("hours") || unit.includes("hour")) { hours += value; } else if (unit.includes("days") || unit.includes("day")) { hours += value * 24; } else if (unit.includes("weeks") || unit.includes("week")) { hours += value * 24 * 7; } else if (unit.includes("months") || unit.includes("month")) { hours += value * 24 * 30; } else if (unit.includes("years") || unit.includes("year")) { hours += value * 24 * 365; } } return hours; } const ITOG = videoElements.map((videoElement) => { let id_of_video = videoElement.querySelector("a#thumbnail") && videoElement.querySelector("a#thumbnail").href.split("?v=")[1] || ""; if (!id_of_video) { id_of_video = videoElement.querySelector("a.yt-simple-endpoint") && videoElement.querySelector("a.yt-simple-endpoint").href.split("?v=")[1] || ""; } // Remove everything after "&pp=" till "@@@" id_of_video = id_of_video.split("&pp=")[0]; const videoTitleElement = videoElement.querySelector("#video-title"); const ariaLabel = videoTitleElement ? videoTitleElement.getAttribute("aria-label") : ""; const viewsMatch = ariaLabel.match(/([\d,]+)\sviews?/); const views = viewsMatch ? parseInt(viewsMatch[1].replace(/,/g, ''), 10) : 0; function extractTimeText(videoElementText) { const publishedTimeTextRegex = /"publishedTimeText":\{"simpleText":"([^"]+)"\}/; const publishedTimeTextMatch = videoElementText.match(publishedTimeTextRegex); return publishedTimeTextMatch ? publishedTimeTextMatch[1] : ""; } function textToSeconds(dataPublished) { var timeValueMatch = dataPublished.match(/\d+/); var timeUnitMatch = dataPublished.match(/[a-zA-Z]+/); if (!timeValueMatch || !timeUnitMatch) { return -1; } var timeValue = parseInt(timeValueMatch[0]); var timeUnit = timeUnitMatch[0].toLowerCase(); var seconds; switch (timeUnit) { case 'years': case 'year': seconds = timeValue * 365 * 24 * 60 * 60; break; case 'months': case 'month': seconds = timeValue * 30 * 24 * 60 * 60; break; case 'weeks': case 'week': seconds = timeValue * 7 * 24 * 60 * 60; break; case 'days': case 'day': seconds = timeValue * 24 * 60 * 60; break; case 'hours': case 'hour': seconds = timeValue * 60 * 60; break; default: // console.error("Invalid time unit:", timeUnit); return -1; } return seconds; } const DATA_PUBLISHED = extractTimeText(SAVED_CONTENT); const seconds = textToSeconds(DATA_PUBLISHED); var VPH = views / (seconds / 3600); var views_per_hour = Math.round(VPH * 100) / 100; // Round to 2 decimal places const shortsURL = `/shorts/${id_of_video}`; const it_is_short_or_not = SAVED_CONTENT.includes(shortsURL) ? "YES_SHORT" : "NO_SHORT"; if (it_is_short_or_not === "YES_SHORT" && !id_of_video) { id_of_video = videoElement.querySelector("a.yt-simple-endpoint") && videoElement.querySelector("a.yt-simple-endpoint").href.split("/shorts/")[1] || ""; } const name_of_video = videoTitleElement ? videoTitleElement.textContent.trim() : ""; return `${id_of_video}@@@${views}^^^${views_per_hour}~~~${it_is_short_or_not}↜↜↜${name_of_video}&&&seconds${seconds}***DATA_PUBLISHED${DATA_PUBLISHED}`; }); // console.log(ITOG); [[ITOG]] = ITOG;