Почему в всех элементах списка одно и тоже значение?
-
Есть 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;