- // ==UserScript==
- // @match https://www.youtube.com/*
- // @version 0.6.0
- // @run-at document-start
- // @name Return YouTube Comment Username
- // @name:ja YouTubeコメント欄の名前を元に戻す
- // @description This script replaces the "handle" in the YouTube comments section to user name
- // @description:ja YouTubeのコメント欄の名前をハンドル(@...)からユーザー名に書き換えます。
- // @name:zh-CN 恢復 YouTube 评论用户名
- // @name:zh-TW 恢復 YouTube 評論名稱
- // @description:zh-TW 此腳本將 YouTube 評論部分中的“handle”替換為用戶名
- // @description:zh-CN 此脚本将 YouTube 评论部分中的“handle”替换为用户名
- // @author yakisova41
- // @namespace https://yt-returnname-api.pages.dev/extension/
- // @grant unsafeWindow
- // @license MIT
- // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAWJAAAFiQFtaJ36AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAABI5JREFUaIHVml1ok1cYx39v4pT6Ebdo0baoWCd+VsEPNqfthigOi0IZnRc1XgxFELwQBGE474eIV1UoOqsw9MILSzsv1G4wRQe1zG9RWdGWVBgSMGldrab/XTy2Sc2bj2aZSf5wyMk5zzn5P5/nzUkcSYzAcT4GAsDXwGpgHIWBIaAT+AU4idQ/MiPJGnwpeC5Qgbeg4LNh3vHkXxUAuUzbP4L1knAEfuARMD0/0ZE1eoElHmA3xUceoBz4zgN8k28m/wGbHUEfMCnfTLLE344gCnjyzSRLyEOhkV+2DM6dg5s34exZqKpKLV8AJTHWNm2SBgY0CgMD0saNydYMOQIl1a6iAmpqYOZMCIehsxNu3cqxyd9h3Djo6oJZsxLnnj2DefMgGn1/Ru4eqKyULlyQhoaUgBs3pMWLc2/95csTPyseVVWuHkhUYMUK6cULW9TWJgUCUk2NtGWLdOqUFI1KoZC0cGFuFVi6NLUC7kZ7TwGfT+ruNpINDZLjSAsWSFOmxGR27LANr13LjNj69bZPOjmPR3ryxJ38o0c2n1aBgwdtwZEj0rRpRlIyj1y/bv1AQLp6NZVbR7eWFqm11YyTTnbdOikSGU0+HJbWrk2axKMVuH/f4r6iQjp50jZ48EA6fTq2YXW1dPiw9XftSk+qtdVk79yR5s5NL19ZKR07Jl2+LDU2plszFHveHz8eFi2C7m4IBqG+3sa3b4fbt6GhAbxeePoUXr60uUnvDvCSEvD73atLSYm9VlVBRwds2wbt7cmrUTgM589DeTn09kIkkrp6jWjj95ul7t6VJk6MWdznk5Yssf7goOT1Ss3N9r6uztYGAqkTMB5v3kgHDiRas7zc9nU7B5qbpbIyVw/EzgHHgYEB6OuD0lLTfsYMOHMGVq0y70SjsHcvHD1qsnPmmMWmTnWv3wCzZ8PkySYfDMbG792D16+tv3o1tLRAWVlyS/f2wtatdhbF23+URu3tpvWGDVZtBgft/aVL0r59MauEQlJtbW7KZ2mpFAxm5r2eHmn69BRJXFdngl1dVj79fmn+/Nj8ypVSfb1VqFyQB6mpKfPwk6Tjx5OE0DAaG2HPHnN5W5u5GixcNm+GpiY4dCh1YmUKn89CY9IYnuYjEUvwvj6XEBpuO3dKDx8mav/4sbR7d+6sX109NusPY80alzIajxMnrFVUWHL291sChkI5MfwIvF64cmXs6yZMGO6leRotfLwqrC8zY0ePB7v1KlbcdQRvAW++mWSJWkcwCHyUbyZZ4A/gCw/FmcR/Ad8iqRgVuAh8jtQDdn2eiQIXgf60UrnHZOziLQTcA35Duh8vkMn9/+9Itf8DuZwgXRkVsP8DcckK6XLgZ6SOD0UmGziCCBZr8RBWXhcgPfvwtDJHMg84wJFCJw/mgZeAL25MwAvgU6RwfmhlDrckdoAfioE8mAdCwCdxYw+BZUhv88RpTHDzwP5iIQ+JP278inQxL0yyRHwVGqLADy03xIfQT0h/5pNMNnAEz4EpwHyk5/kmNFYM58CPxUgezAMdwFfE/wOkiOABvi9W8gD/AtVVmDkJXLSNAAAAAElFTkSuQmCC
- // ==/UserScript==
-
- // src/index.ts
- function c3JjL2luZGV4LnRz() {
- "use strict";
- (() => {
- // node_modules/crx-monkey/dist/client/main.js
- function getRunningRuntime() {
- if (typeof window.__CRX_CONTENT_BUILD_ID === "undefined") {
- return "Userscript";
- } else {
- return "Extension";
- }
- }
- async function bypassSendMessage(message, options, callback) {
- const actionId = crypto.randomUUID();
- window.postMessage(
- {
- type: "send-message",
- crxContentBuildId: window.__CRX_CONTENT_BUILD_ID,
- detail: { message, options },
- actionId,
- },
- "*",
- );
- const data = await waitResultOnce("send-message", actionId);
- if (callback !== void 0) {
- callback(data.response);
- }
- }
- async function waitResultOnce(type, actionId) {
- return new Promise((resolve) => {
- const onResult = (e) => {
- if (e.detail.type === type && e.detail.actionId === actionId) {
- window.removeEventListener(
- "crx-isolate-connector-result",
- onResult,
- );
- resolve(e.detail.data);
- }
- };
- window.addEventListener("crx-isolate-connector-result", onResult);
- });
- }
-
- // src/utils/isCommentRenderer.ts
- function isCommentRenderer(continuationItems) {
- if (continuationItems.length > 0) {
- if ("commentThreadRenderer" in continuationItems[0]) {
- return false;
- }
- if ("commentRenderer" in continuationItems[0]) {
- return true;
- }
- }
- return false;
- }
- function isCommentRendererV2(continuationItems) {
- if (continuationItems.length > 0) {
- if ("commentThreadRenderer" in continuationItems[0]) {
- return false;
- }
- if ("commentViewModel" in continuationItems[0]) {
- return true;
- }
- }
- return false;
- }
-
- // package.json
- var package_default = {
- name: "return-youtube-comment-username",
- version: "0.6.0",
- devDependencies: {
- "@types/chrome": "^0.0.263",
- "@types/encoding-japanese": "^2.0.5",
- "@types/markdown-it": "^13.0.8",
- eslint: "^8.57.0",
- prettier: "^3.3.1",
- "ts-extension-builder": "^0.2.8",
- },
- license: "MIT",
- scripts: {
- "esbuild-register": "node --require esbuild-register",
- build: "npx crx-monkey build",
- dev: "npx crx-monkey dev",
- lint: "npx eslint --fix src/**/*.ts",
- },
- type: "module",
- dependencies: {
- "@mdit-vue/plugin-title": "^2.1.3",
- "@typescript-eslint/eslint-plugin": "^6.21.0",
- "@typescript-eslint/parser": "^6.21.0",
- "crx-monkey": "0.11.2",
- "encoding-japanese": "^2.2.0",
- "eslint-config-prettier": "^9.1.0",
- "markdown-it": "^14.1.0",
- typescript: "^5.4.5",
- },
- };
-
- // src/utils/debugLog.ts
- function debugLog(message, value = "") {
- if (getRunningRuntime() === "Extension") {
- bypassSendMessage({
- type: "log",
- value: [`[rycu] ${message} %c${value}`, "color:cyan;"],
- });
- } else {
- console.log(`[rycu] ${message} %c${value}`, "color:cyan;");
- }
- }
- function debugErr(message) {
- console.error(`[rycu] ${message}`);
- if (getRunningRuntime() === "Extension") {
- bypassSendMessage({
- type: "err",
- value: [`[rycu] ${message}`],
- });
- }
- }
- function outputDebugInfo() {
- const logs = [""];
- const ytConf = window.yt.config_;
- if (ytConf !== void 0) {
- logs.push(
- "PAGE_BUILD_LABEL: " +
- (ytConf.PAGE_BUILD_LABEL !== void 0
- ? ytConf.PAGE_BUILD_LABEL
- : " undefined"),
- );
- logs.push(
- "INNERTUBE_CLIENT_VERSION: " +
- (ytConf.INNERTUBE_CLIENT_VERSION !== void 0
- ? ytConf.INNERTUBE_CLIENT_VERSION
- : " undefined"),
- );
- logs.push(
- "INNERTUBE_CONTEXT_CLIENT_VERSION: " +
- (ytConf.INNERTUBE_CONTEXT_CLIENT_VERSION !== void 0
- ? ytConf.INNERTUBE_CONTEXT_CLIENT_VERSION
- : " undefined"),
- );
- logs.push(
- "INNERTUBE_CONTEXT_GL: " +
- (ytConf.INNERTUBE_CONTEXT_GL !== void 0
- ? ytConf.INNERTUBE_CONTEXT_GL
- : " undefined"),
- );
- logs.push(
- "Browser: " +
- (ytConf.INNERTUBE_CONTEXT.client.browserName !== void 0
- ? ytConf.INNERTUBE_CONTEXT.client.browserName
- : " undefined"),
- );
- logs.push(
- "Is login: " +
- (ytConf.LOGGED_IN !== void 0
- ? `${ytConf.LOGGED_IN}`
- : " undefined"),
- );
- }
- logs.push(`Href: ${location.href}`);
- debugLog(
- `Return Youtube comment Username v${package_default.version}`,
- logs.join("\n"),
- );
- }
-
- // src/utils/findElementByTrackingParams.ts
- function findElementByTrackingParams(trackingParams, elementSelector) {
- let returnElement = null;
- let errorAlerted = false;
- const elems = document.querySelectorAll(elementSelector);
- for (let i = 0; i < elems.length; i++) {
- if (
- elems[i]?.trackedParams === void 0 &&
- elems[i]?.polymerController?.trackedParams === void 0
- ) {
- debugErr(new Error("TrackedParams not found in element property."));
- }
- if (elems[i].trackedParams === trackingParams) {
- returnElement = elems[i];
- break;
- } else if (
- elems[i]?.polymerController?.trackedParams === trackingParams
- ) {
- returnElement = elems[i];
- break;
- } else {
- if (!errorAlerted) {
- void searchTrackedParamsByObject(trackingParams, elems[i]);
- errorAlerted = true;
- }
- }
- }
- return returnElement;
- }
- async function reSearchElement(trackingParams, selector) {
- return await new Promise((resolve) => {
- let isFinding = true;
- const search = () => {
- const el = findElementByTrackingParams(trackingParams, selector);
- if (el !== null) {
- resolve(el);
- isFinding = false;
- }
- if (isFinding) {
- setTimeout(() => {
- search();
- }, 100);
- }
- };
- search();
- });
- }
- function findElementAllByCommentId(commnetId, elementSelector) {
- const returnElements = [];
- const elems = document.querySelectorAll(elementSelector);
- for (let i = 0; i < elems.length; i++) {
- if (elems[i] !== void 0) {
- if (
- elems[i]?.__data?.data?.commentId === void 0 &&
- elems[i]?.polymerController?.__data?.data?.commentId === void 0
- ) {
- debugErr(new Error("Reply CommentId not found."));
- } else if (
- elems[i]?.__data?.data?.commentId !== void 0 &&
- elems[i].__data.data.commentId === commnetId
- ) {
- returnElements.push(elems[i]);
- } else if (
- elems[i]?.polymerController?.__data?.data?.commentId !== void 0 &&
- elems[i].polymerController.__data.data.commentId === commnetId
- ) {
- returnElements.push(elems[i]);
- }
- }
- }
- return returnElements;
- }
- async function reSearchElementAllByCommentId(commnetId, selector) {
- return await new Promise((resolve) => {
- let isFinding = true;
- const search = () => {
- const el = findElementAllByCommentId(commnetId, selector);
- if (el !== null) {
- resolve(el);
- isFinding = false;
- }
- if (isFinding) {
- setTimeout(() => {
- search();
- }, 100);
- }
- };
- search();
- });
- }
- async function searchTrackedParamsByObject(param, elem) {
- const elemObj = Object(elem);
- const search = (obj, history) => {
- Object.keys(obj).forEach((k) => {
- if (typeof obj[k] === "object") {
- search(obj[k], [...history, k]);
- } else if (obj[k] === param) {
- history.push(k);
- throw debugErr(
- new Error(`Unknown Object format!
- "${history.join(" > ")}"`),
- );
- }
- });
- };
- search(elemObj, []);
- }
-
- // src/types/AppendContinuationItemsAction.ts
- function isReplyContinuationItemsV1(obj) {
- return Object.hasOwn(obj[0], "commentRenderer");
- }
- function isReplyContinuationItemsV2(obj) {
- return Object.hasOwn(obj[0], "commentViewModel");
- }
- function isConfinuationItemV2(obj) {
- return Object.hasOwn(obj, "commentViewModel");
- }
- function isConfinuationItemV1(obj) {
- return Object.hasOwn(obj, "comment");
- }
-
- // src/utils/escapeString.ts
- function escapeString(text) {
- return text
- .replace(/</g, "<")
- .replace(/>/g, ">")
- .replace(/"/g, `"`)
- .replace(/'/g, `'`)
- .replace(/&/g, `&`);
- }
- function decodeString(text) {
- return text
- .replace(/</g, "<")
- .replace(/>/g, ">")
- .replace(/"/g, `"`)
- .replace(/'/g, `'`)
- .replace(/&/g, `&`);
- }
-
- // src/utils/getUserName.ts
- var isUseFeed = true;
- async function getUserName(id) {
- return new Promise((resolve) => {
- if (isUseFeed) {
- fetchFeed(id)
- .then((name) => {
- resolve(name);
- })
- .catch(() => {
- isUseFeed = false;
- debugErr(
- new Error("Catch Feed API Error, so change to Browse mode."),
- );
- fetchBrowse(id).then((name) => {
- resolve(name);
- });
- });
- } else {
- fetchBrowse(id).then((name) => {
- resolve(name);
- });
- }
- });
- }
- async function fetchFeed(id) {
- return await fetch(
- `https://www.youtube.com/feeds/videos.xml?channel_id=${id}`,
- {
- method: "GET",
- cache: "default",
- keepalive: true,
- },
- )
- .then(async (res) => {
- if (res.status !== 200)
- throw debugErr(
- new Error(`Feed API Error
- status: ${res.status}`),
- );
- return await res.text();
- })
- .then((text) => {
- const match = text.match("<title>([^<].*)</title>");
- if (match !== null) {
- return decodeString(match[1]);
- } else {
- debugErr("XML title not found");
- return "";
- }
- });
- }
- async function fetchBrowse(id) {
- return await fetch(
- `https://www.youtube.com/youtubei/v1/browse?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8&prettyPrint=false`,
- {
- method: "POST",
- headers: {
- cache: "default",
- accept: "*/*",
- "accept-encoding": "gzip, deflate, br",
- "accept-language": "en",
- "content-type": "application/json",
- dnt: "1",
- referer: `https://www.youtube.com/channel/${id}`,
- },
- body: JSON.stringify({
- context: {
- client: {
- hl: window.yt.config_.HL,
- gl: window.yt.config_.GL,
- clientName: "WEB",
- clientVersion: "2.20230628.01.00",
- platform: "DESKTOP",
- acceptHeader:
- "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
- },
- user: { lockedSafetyMode: false },
- request: {
- useSsl: true,
- },
- },
- browseId: id,
- params: "EgVhYm91dPIGBAoCEgA%3D",
- }),
- },
- )
- .then(async (res) => {
- if (res.status !== 200)
- throw debugErr(
- new Error(`Browse API Error
- status: ${res.status}`),
- );
- return await res.json();
- })
- .then((text) => {
- const name = text.header.c4TabbedHeaderRenderer.title;
- return decodeString(name);
- });
- }
-
- // src/rewrites/rewriteOfCommentRenderer/nameRewriteOfCommentRenderer.ts
- function nameRewriteOfCommentRenderer(
- commentRenderer,
- isNameContainerRender,
- userId,
- ) {
- const commentRendererBody =
- commentRenderer.__shady_native_children.namedItem("body");
- if (commentRendererBody === null) {
- throw debugErr(new Error("Comment renderer body is null."));
- }
- let nameElem = commentRendererBody.querySelector(
- "#main > #header > #header-author > h3 > a > yt-formatted-string",
- );
- if (isNameContainerRender) {
- const containerMain =
- commentRendererBody.__shady_native_children.namedItem("main");
- if (containerMain !== null) {
- nameElem = containerMain.querySelector(
- "#header > #header-author > #author-comment-badge > ytd-author-comment-badge-renderer > a > #channel-name > #container > #text-container > yt-formatted-string",
- );
- }
- }
- void getUserName(userId)
- .then((name) => {
- if (nameElem !== null) {
- if (nameElem.getAttribute("is-empty") !== null) {
- nameElem.removeAttribute("is-empty");
- }
- if (isNameContainerRender) {
- nameElem.textContent = escapeString(name);
- } else {
- nameElem.textContent = name;
- }
- } else {
- debugErr(new Error("Name element is null"));
- }
- })
- .catch((e) => {
- debugErr(e);
- });
- }
-
- // src/rewrites/rewriteOfCommentRenderer/mentionRewriteOfCommentRenderer.ts
- function mentionRewriteOfCommentRenderer(commentRenderer) {
- const commentRendererBody =
- commentRenderer.__shady_native_children.namedItem("body");
- const main2 = commentRendererBody?.querySelector("#main");
- if (main2 !== void 0 && main2 !== null) {
- const aTags = main2.querySelectorAll(
- "#comment-content > ytd-expander > #content > #content-text > a",
- );
- for (let i = 0; i < aTags.length; i++) {
- if (aTags[i].getAttribute("href")?.match("/channel/.*") !== null) {
- const href = aTags[i].getAttribute("href");
- if (href !== null) {
- void getUserName(href.split("/")[2])
- .then((name) => {
- aTags[i].textContent = `@${name} `;
- })
- .catch((e) => {
- debugErr(e);
- });
- } else {
- debugErr(new Error("Mention Atag has not Href attr."));
- }
- }
- }
- }
- }
-
- // src/rewrites/rewriteOfCommentRenderer/nameRewriteOfCommentViewModel.ts
- function nameRewriteOfCommentViewModel(commentViewModel) {
- const commentViewModelBody =
- commentViewModel.__shady_native_children.namedItem("body");
- if (commentViewModelBody === null) {
- throw debugErr(new Error("Comment view model body is null."));
- }
- if (!commentViewModelBodyGuard(commentViewModelBody)) {
- throw debugErr(
- new Error("The object format of comment view model is invalid."),
- );
- }
- const isNameContainerRender =
- commentViewModelBody.__shady.ea.__shady.ea.host.authorCommentBadge !==
- null;
- let nameElem = commentViewModelBody.querySelector(
- "#main > #header > #header-author > h3 > a > span",
- );
- const userId =
- commentViewModelBody.__shady.ea.__shady.ea.host.authorNameEndpoint
- .browseEndpoint.browseId;
- const userHandle =
- commentViewModelBody.__shady.ea.__shady.ea.host.authorNameEndpoint.browseEndpoint.canonicalBaseUrl.substring(
- 1,
- );
- if (isNameContainerRender) {
- const containerMain =
- commentViewModelBody.__shady_native_children.namedItem("main");
- if (containerMain !== null) {
- nameElem = containerMain.querySelector(
- "#header > #header-author > #author-comment-badge > ytd-author-comment-badge-renderer > a > #channel-name > #container > #text-container > yt-formatted-string",
- );
- }
- }
- void getUserName(userId)
- .then((name) => {
- if (nameElem !== null) {
- if (nameElem.getAttribute("is-empty") !== null) {
- nameElem.removeAttribute("is-empty");
- }
- let innerText = name;
- if (window.__rycu.settings.isShowNameToHandle) {
- innerText = decodeURI(userHandle) + ` ( ${name} )`;
- }
- if (window.__rycu.settings.isShowHandleToName) {
- innerText = name + ` ( ${decodeURI(userHandle)} )`;
- }
- if (isNameContainerRender) {
- nameElem.textContent = escapeString(innerText);
- } else {
- nameElem.textContent = innerText;
- }
- } else {
- debugErr(new Error("Name element is null"));
- }
- })
- .catch((e) => {
- debugErr(e);
- });
- }
- function commentViewModelBodyGuard(elem) {
- return Object.hasOwn(elem, "__shady");
- }
-
- // src/rewrites/rewriteOfCommentRenderer/mentionRewriteOfCommentRendererV2.ts
- function mentionRewriteOfCommentRendererV2(commentRenderer) {
- const commentRendererBody =
- commentRenderer.__shady_native_children.namedItem("body");
- const main2 = commentRendererBody?.querySelector("#main");
- if (main2 !== void 0 && main2 !== null) {
- const aTags = main2.querySelectorAll(
- "#expander > #content > #content-text > span > span > a",
- );
- for (let i = 0; i < aTags.length; i++) {
- if (aTags[i].getAttribute("href")?.match("/channel/.*") !== null) {
- const href = aTags[i].getAttribute("href");
- if (href !== null) {
- void getUserName(href.split("/")[2])
- .then((name) => {
- aTags[i].textContent = `@${name} `;
- })
- .catch((e) => {
- debugErr(e);
- });
- } else {
- debugErr(new Error("Mention Atag has not Href attr."));
- }
- }
- }
- }
- }
-
- // src/rewrites/reply.ts
- function rewriteReplytNameFromContinuationItems(continuationItems) {
- debugLog("Rewrite Reply.");
- if (isReplyContinuationItemsV1(continuationItems)) {
- debugLog("Rewrite reply of continuationItems.");
- for (let i = 0; i < continuationItems.length; i++) {
- const { commentRenderer } = continuationItems[i];
- if (commentRenderer !== void 0) {
- void getReplyElem(commentRenderer.trackingParams, "V1").then(
- (replyElem) => {
- reWriteReplyElem(replyElem, commentRenderer);
- },
- );
- }
- }
- }
- if (isReplyContinuationItemsV2(continuationItems)) {
- debugLog("Rewrite reply of comment view model.");
- for (let i = 0; i < continuationItems.length; i++) {
- const { commentViewModel } = continuationItems[i];
- if (commentViewModel !== void 0) {
- void getReplyElem(
- commentViewModel.rendererContext.loggingContext.loggingDirectives
- .trackingParams,
- "V2",
- ).then((replyElem) => {
- reWriteReplyElemV2(replyElem);
- });
- }
- }
- }
- }
- function reWriteReplyElem(replyElem, rendererData) {
- let isContainer = rendererData.authorIsChannelOwner;
- if (rendererData.authorCommentBadge !== void 0) {
- isContainer = true;
- }
- nameRewriteOfCommentRenderer(
- replyElem,
- isContainer,
- rendererData.authorEndpoint.browseEndpoint.browseId,
- );
- mentionRewriteOfCommentRenderer(replyElem);
- replyInputRewrite(replyElem);
- }
- function reWriteReplyElemV2(replyElem) {
- nameRewriteOfCommentViewModel(replyElem);
- mentionRewriteOfCommentRendererV2(replyElem);
- replyInputRewrite(replyElem);
- }
- async function getReplyElem(trackedParams, version) {
- return await new Promise((resolve) => {
- const selector =
- "#replies > ytd-comment-replies-renderer > #expander > #expander-contents > #contents > " +
- (version === "V1"
- ? "ytd-comment-renderer"
- : "ytd-comment-view-model");
- const commentRenderer = findElementByTrackingParams(
- trackedParams,
- selector,
- );
- if (commentRenderer !== null) {
- resolve(commentRenderer);
- } else {
- void reSearchElement(trackedParams, selector).then(
- (commentRenderer2) => {
- resolve(commentRenderer2);
- },
- );
- }
- });
- }
- function rewriteTeaserReplytNameFromContinuationItems(continuationItems) {
- debugLog("Rewrite teaser Reply.");
- for (let i = 0; i < continuationItems.length; i++) {
- if (isReplyContinuationItemsV1(continuationItems)) {
- debugLog("Teaser reply of continuationItems.");
- const { commentRenderer } = continuationItems[i];
- if (commentRenderer !== void 0) {
- void reSearchElementAllByCommentId(
- commentRenderer.commentId,
- "ytd-comment-replies-renderer > #teaser-replies > ytd-comment-renderer",
- ).then((replyElems) => {
- replyElems.forEach((replyElem) => {
- reWriteReplyElem(replyElem, commentRenderer);
- });
- });
- void reSearchElementAllByCommentId(
- commentRenderer.commentId,
- "ytd-comment-replies-renderer > #expander > #expander-contents > #contents > ytd-comment-renderer",
- ).then((replyElems) => {
- replyElems.forEach((replyElem) => {
- reWriteReplyElem(replyElem, commentRenderer);
- });
- });
- }
- }
- if (isReplyContinuationItemsV2(continuationItems)) {
- debugLog("Teaser reply of comment view model.");
- const { commentViewModel } = continuationItems[i];
- if (commentViewModel !== void 0) {
- const elem = findElementByTrackingParams(
- commentViewModel.rendererContext.loggingContext.loggingDirectives
- .trackingParams,
- "#teaser-replies > ytd-comment-view-model",
- );
- if (elem === null) {
- throw debugErr(
- new Error("Can not found Teaser Reply in V2 Elem."),
- );
- }
- reWriteReplyElemV2(elem);
- }
- }
- }
- }
- function replyInputRewrite(replyElem) {
- const replyToReplyBtn = replyElem.querySelector(
- "#reply-button-end > ytd-button-renderer",
- );
- const replyToReplyHander = () => {
- const replyLink = replyElem.querySelector("#contenteditable-root > a");
- const href = replyLink?.getAttribute("href");
- const channelId = href?.split("/")[2];
- if (channelId !== void 0 && replyLink !== null) {
- void getUserName(channelId).then((name) => {
- replyLink.textContent = ` @${name}`;
- });
- }
- replyToReplyBtn?.removeEventListener("click", replyToReplyHander);
- };
- replyToReplyBtn?.addEventListener("click", replyToReplyHander);
- document.addEventListener("rycu-pagechange", () => {
- replyToReplyBtn?.removeEventListener("click", replyToReplyHander);
- });
- }
-
- // src/rewrites/comment.ts
- function rewriteCommentNameFromContinuationItems(continuationItems) {
- debugLog("Rewrite Comment.");
- for (let i = 0; i < continuationItems.length; i++) {
- if (continuationItems[i].commentThreadRenderer !== void 0) {
- void getCommentElem(
- continuationItems[i].commentThreadRenderer.trackingParams,
- ).then((commentElem) => {
- reWriteCommentElem(
- commentElem,
- continuationItems[i].commentThreadRenderer,
- );
- });
- const teaserContents =
- continuationItems[i].commentThreadRenderer.replies
- ?.commentRepliesRenderer.teaserContents;
- if (teaserContents !== void 0) {
- rewriteTeaserReplytNameFromContinuationItems(teaserContents);
- }
- }
- }
- }
- function reWriteCommentElem(commentElem, commentThreadRenderer) {
- const commentRenderer =
- commentElem.__shady_native_children.namedItem("comment");
- if (commentRenderer !== null && commentRenderer !== void 0) {
- if (isConfinuationItemV1(commentThreadRenderer)) {
- debugLog("Rewrite of Comment Renderer.");
- let isContainer =
- commentThreadRenderer.comment.commentRenderer.authorIsChannelOwner;
- if (
- commentThreadRenderer.comment.commentRenderer.authorCommentBadge !==
- void 0
- ) {
- isContainer = true;
- }
- nameRewriteOfCommentRenderer(
- commentRenderer,
- isContainer,
- commentThreadRenderer.comment.commentRenderer.authorEndpoint
- .browseEndpoint.browseId,
- );
- }
- if (isConfinuationItemV2(commentThreadRenderer)) {
- debugLog("Rewrite of Comment view model.");
- nameRewriteOfCommentViewModel(commentRenderer);
- }
- }
- }
- async function getCommentElem(trackingParams) {
- return await new Promise((resolve) => {
- const commentElem = findElementByTrackingParams(
- trackingParams,
- "#comments > #sections > #contents > ytd-comment-thread-renderer",
- );
- if (commentElem !== null) {
- resolve(commentElem);
- } else {
- void reSearchElement(trackingParams, "ytd-comment-thread-renderer")
- .then((commentElem2) => {
- resolve(commentElem2);
- })
- .catch((e) => {
- debugErr(e);
- });
- }
- });
- }
-
- // src/handlers/handleYtAppendContinuationItemsAction.ts
- function handleYtAppendContinuationItemsAction(detail) {
- const continuationItems =
- detail.args[0].appendContinuationItemsAction.continuationItems;
- if (
- isCommentRenderer(continuationItems) ||
- isCommentRendererV2(continuationItems)
- ) {
- const replyDetail = detail;
- setTimeout(() => {
- rewriteReplytNameFromContinuationItems(
- replyDetail.args[0].appendContinuationItemsAction.continuationItems,
- );
- }, 100);
- } else {
- const commentDetail = detail;
- setTimeout(() => {
- rewriteCommentNameFromContinuationItems(
- commentDetail.args[0].appendContinuationItemsAction
- .continuationItems,
- );
- }, 400);
- }
- }
-
- // src/handlers/handleYtCreateCommentAction.ts
- function handleYtCreateCommentAction(detail) {
- const createCommentDetail = detail;
- const continuationItems = [
- {
- commentThreadRenderer:
- createCommentDetail.args[0].createCommentAction.contents
- .commentThreadRenderer,
- },
- ];
- setTimeout(() => {
- rewriteCommentNameFromContinuationItems(continuationItems);
- }, 100);
- }
-
- // src/handlers/handleYtCreateCommentReplyAction.ts
- function handleYtCreateCommentReplyAction(detail) {
- const createReplyDetail = detail;
- const continuationItems = [
- {
- commentRenderer:
- createReplyDetail.args[0].createCommentReplyAction.contents
- .commentRenderer,
- },
- ];
- setTimeout(() => {
- rewriteTeaserReplytNameFromContinuationItems(continuationItems);
- }, 100);
- }
-
- // src/rewrites/highlightedReply.ts
- function rewriteHighlightedReply(trackedParams) {
- getReplyElem2(trackedParams, "V1").then((replyElem) => {
- reWriteReplyElemV2(replyElem);
- });
- }
- function rewriteHighlightedReplyV2(trackedParams) {
- getReplyElem2(trackedParams, "V2").then((replyElem) => {
- reWriteReplyElemV2(replyElem);
- });
- }
- async function getReplyElem2(trackedParams, version) {
- return await new Promise((resolve) => {
- const selector =
- "ytd-comment-replies-renderer > #teaser-replies > " +
- (version === "V1"
- ? "ytd-comment-renderer"
- : "ytd-comment-view-model");
- const commentRenderer = findElementByTrackingParams(
- trackedParams,
- selector,
- );
- if (commentRenderer !== null) {
- resolve(commentRenderer);
- } else {
- void reSearchElement(trackedParams, selector).then(
- (commentRenderer2) => {
- resolve(commentRenderer2);
- },
- );
- }
- });
- }
-
- // src/handlers/handleYtGetMultiPageMenuAction.ts
- function handleYtGetMultiPageMenuAction(detail) {
- debugLog("handleYtGetMultiPageMenuAction");
- const getMultiPageMenuDetail = detail;
- const continuationItems =
- getMultiPageMenuDetail.args[0].getMultiPageMenuAction.menu
- .multiPageMenuRenderer.sections[1].itemSectionRenderer?.contents;
- const highLightedTeaserContents =
- getMultiPageMenuDetail.args[0]?.getMultiPageMenuAction?.menu
- ?.multiPageMenuRenderer.sections[1].itemSectionRenderer?.contents[0]
- ?.commentThreadRenderer.replies?.commentRepliesRenderer
- ?.teaserContents;
- if (continuationItems !== void 0) {
- setTimeout(() => {
- rewriteCommentNameFromContinuationItems(continuationItems);
- if (highLightedTeaserContents !== void 0) {
- debugLog("HighLighted Teaser Reply found.");
- if (isReplyContinuationItemsV1(highLightedTeaserContents)) {
- debugLog("highLighted Teaser Reply V1");
- const highLightedReplyRenderer =
- highLightedTeaserContents[0]?.commentRenderer;
- rewriteHighlightedReply(highLightedReplyRenderer.trackingParams);
- } else {
- debugLog("highLighted Teaser Reply V2");
- const commentViewModel =
- highLightedTeaserContents[0]?.commentViewModel;
- const trackingParams =
- commentViewModel.rendererContext.loggingContext
- .loggingDirectives.trackingParams;
- rewriteHighlightedReplyV2(trackingParams);
- }
- }
- }, 100);
- }
- }
-
- // src/handlers/handleYtHistory.ts
- function handleYtHistory(detail) {
- const historyDetail = detail;
- const continuationItems =
- historyDetail.args[1].historyEntry?.rootData.response.contents
- .twoColumnWatchNextResults?.results?.results?.contents[3]
- ?.itemSectionRenderer?.contents;
- if (continuationItems !== void 0) {
- setTimeout(() => {
- rewriteCommentNameFromContinuationItems(continuationItems);
- }, 100);
- }
- }
-
- // src/handlers/handleYtReloadContinuationItemsCommand.ts
- function handleYtReloadContinuationItemsCommand(detail) {
- const reloadDetail = detail;
- const { slot } = reloadDetail.args[0].reloadContinuationItemsCommand;
- if (slot === "RELOAD_CONTINUATION_SLOT_BODY") {
- const continuationItems =
- reloadDetail.args[0].reloadContinuationItemsCommand.continuationItems;
- if (continuationItems !== void 0) {
- setTimeout(() => {
- rewriteCommentNameFromContinuationItems(continuationItems);
- }, 100);
- }
- }
- }
-
- // src/index.ts
- function main() {
- const settings = {
- isShowHandleToName: false,
- isShowNameToHandle: false,
- };
- window.__rycu = {
- settings,
- };
- if (getRunningRuntime() === "Extension") {
- bypassSendMessage(
- {
- type: "getShowHandleToName",
- value: null,
- },
- {},
- (isShowHandleToName) => {
- window.__rycu.settings.isShowHandleToName = isShowHandleToName;
- },
- );
- bypassSendMessage(
- {
- type: "getShowNameToHandle",
- value: null,
- },
- {},
- (isShowNameToHandle) => {
- window.__rycu.settings.isShowNameToHandle = isShowNameToHandle;
- },
- );
- }
- const handleYtAction = (e) => {
- switch (e.detail.actionName) {
- case "yt-append-continuation-items-action":
- handleYtAppendContinuationItemsAction(e.detail);
- break;
- case "yt-reload-continuation-items-command":
- handleYtReloadContinuationItemsCommand(e.detail);
- break;
- case "yt-history-load":
- handleYtHistory(e.detail);
- break;
- case "yt-get-multi-page-menu-action":
- handleYtGetMultiPageMenuAction(e.detail);
- break;
- case "yt-create-comment-action":
- handleYtCreateCommentAction(e.detail);
- break;
- case "yt-create-comment-reply-action":
- handleYtCreateCommentReplyAction(e.detail);
- break;
- }
- };
- document.addEventListener("yt-action", handleYtAction);
- document.addEventListener("yt-navigate-finish", () => {
- document.dispatchEvent(new Event("rycu-pagechange"));
- outputDebugInfo();
- });
- }
- main();
- })();
- }
-
- if (location.href.match("https://www.youtube.com/*") !== null) {
- document.addEventListener("DOMContentLoaded", () => {
- const script = document.createElement("script");
- if (unsafeWindow.trustedTypes !== undefined) {
- const policy = unsafeWindow.trustedTypes.createPolicy(
- "crx-monkey-trusted-inject-policy",
- { createScript: (input) => input },
- );
- script.text = policy.createScript(
- script.text + `(${c3JjL2luZGV4LnRz.toString()})();`,
- );
- } else {
- script.innerHTML =
- script.innerHTML + `(${c3JjL2luZGV4LnRz.toString()})();`;
- }
- unsafeWindow.document.body.appendChild(script);
- });
- }