From 3b2e10b7aa5ee53eae3b9c6e94b3c47d76ab4e49 Mon Sep 17 00:00:00 2001
From: Koen <koen@pop-os.localdomain>
Date: Tue, 19 Sep 2023 14:40:58 +0200
Subject: [PATCH] Ported changes from Hotfix.

---
 YoutubeConfig.json |   2 +-
 YoutubeScript.js   |  70 +++++++++++---
 diff               | 235 +++++++++++++++++++++++++++++++++++++++++++++
 twitch.png         | Bin 0 -> 36314 bytes
 4 files changed, 291 insertions(+), 16 deletions(-)
 create mode 100644 diff
 create mode 100644 twitch.png

diff --git a/YoutubeConfig.json b/YoutubeConfig.json
index 79a07ca..43da9ba 100644
--- a/YoutubeConfig.json
+++ b/YoutubeConfig.json
@@ -7,7 +7,7 @@
 	"sourceUrl": "https://plugins.grayjay.app/Youtube/YoutubeConfig.json",
 	"repositoryUrl": "https://futo.org",
 	"scriptUrl": "./YoutubeScript.js",
-	"version": 113,
+	"version": 118,
 	"iconUrl": "./youtube.png",
 	"id": "35ae969a-a7db-11ed-afa1-0242ac120002",
 
diff --git a/YoutubeScript.js b/YoutubeScript.js
index 8a3f795..0c43e9f 100644
--- a/YoutubeScript.js
+++ b/YoutubeScript.js
@@ -17,7 +17,7 @@ const URL_SUBSCRIPTIONS_M = "https://m.youtube.com/feed/subscriptions";
 const URL_PLAYLIST = "https://youtube.com/playlist?list=";
 const URL_PLAYLISTS_M = "https://m.youtube.com/feed/library";
 
-const URL_LIVE_CHAT_HTML = "https://www.youtube.com/live_chat";
+const URL_LIVE_CHAT_HTML = "https://www.youtube.com/live_chat?v=";
 const URL_LIVE_CHAT = "https://www.youtube.com/youtubei/v1/live_chat/get_live_chat";
 
 const URL_WATCHTIME = "https://www.youtube.com/api/stats/watchtime";
@@ -427,13 +427,29 @@ source.getContentDetails = (url, useAuth) => {
 
 	return finalResult;
 };
+source.getLiveChatWindow = function(url) {
+	const id = extractVideoIDFromUrl(url);
+	if(!id)
+		throw new ScriptException("No valid id found");
+
+	const chatUrl = URL_LIVE_CHAT_HTML + id;
 
+	const chatHtmlResp = http.GET(chatUrl, {}, false);
+	if(!chatHtmlResp.isOk)
+		return null;
+	else {
+		return {
+			url: chatUrl,
+			removeElements: [ "yt-live-chat-header-renderer", "#ticker" ]
+		};
+	}
+}
 source.getLiveEvents = function(url) {
 	const id = extractVideoIDFromUrl(url);
 	if(!id)
 		throw new ScriptException("No valid id found");
 
-	const chatHtmlResp = http.GET(URL_LIVE_CHAT_HTML + "?v=" + id, {}, false);
+	const chatHtmlResp = http.GET(URL_LIVE_CHAT_HTML + id, {}, false);
 	if(!chatHtmlResp.isOk)
 		throw new ScriptException("Failed to get chat html");
 	const chatHtml = chatHtmlResp.body;
@@ -473,6 +489,9 @@ class YoutubePlaybackTracker extends PlaybackTracker {
 		
 		this.watchUrl = playerData.playbackTracking?.videostatsWatchtimeUrl?.baseUrl;
 		this.playbackUrl = playerData.playbackTracking?.videostatsPlaybackUrl?.baseUrl;
+		if(!this.playbackUrl || !this.watchUrl)
+			throw new ScriptException("Playback tracking unavailable");
+
 		this.playbackUrlBase = this.playbackUrl.substring(0, this.playbackUrl.indexOf("?"));
 		this.watchUrlBase = this.watchUrl.substring(0, this.watchUrl.indexOf("?"));
 		this.watchParams = parseQueryString(this.watchUrl);
@@ -1528,7 +1547,7 @@ function requestInitialData(url, useMobile = false, useAuth = false) {
 		const initialData = getInitialData(html);
 		return initialData;
 	}
-	else throw new ScriptException("Failed to request page [" + resp.code + "]");
+	else throw new ScriptException("Failed to request page [" + resp.code + "]\n" + url + "\n");
 }
 function requestClientConfig(useMobile = false, useAuth = false) {
 	let headers = {
@@ -1754,9 +1773,13 @@ function extractChannelListSubMenuAvatarRenderer_AuthorLink(renderer) {
  * @returns  {String[]} Urls
  */
 function extractChannelListSubMenuAvatarRenderer_URL(renderer) {
-	const url = renderer?.navigationEndpoint?.browseEndpoint?.canonicalBaseUrl ?
+	const canonicalUrl = renderer?.navigationEndpoint?.browseEndpoint?.canonicalBaseUrl ?
 		URL_BASE + renderer.navigationEndpoint.browseEndpoint.canonicalBaseUrl :
 		null;
+	const idUrl = renderer?.navigationEndpoint?.browseEndpoint?.browseId ?
+		URL_BASE + "/channel/" + renderer.navigationEndpoint.browseEndpoint.browseId :
+		null;
+	const url = idUrl ?? canonicalUrl;
 	if(!url)
 		return null;
 	else
@@ -1848,6 +1871,13 @@ function extractChannel_PlatformChannel(initialData, sourceUrl = null) {
 	const bannerTargetWidth = 1080;
 	const banner = (banners && banners.length > 0) ? banners.sort((a,b)=>Math.abs(a.width - bannerTargetWidth) - Math.abs(b.width - bannerTargetWidth))[0] : { url: "" };
 	
+	const idUrl = headerRenderer?.navigationEndpoint?.browseEndpoint?.browseId ?
+	    URL_BASE + "/channel/" + headerRenderer.navigationEndpoint.browseEndpoint.browseId :
+	    null;
+	const canonicalUrl = headerRenderer?.navigationEndpoint?.browseEndpoint?.canonicalBaseUrl ?
+	    URL_BASE + headerRenderer.navigationEndpoint.browseEndpoint.canonicalBaseUrl :
+	    null;
+
 	return new PlatformChannel({
 		id: new PlatformID(PLATFORM, headerRenderer.channelId, config.id, PLATFORM_CLAIMTYPE),
 		name: headerRenderer.title ?? "",
@@ -1855,7 +1885,8 @@ function extractChannel_PlatformChannel(initialData, sourceUrl = null) {
 		banner: banner.url,
 		subscribers: Math.max(0, extractHumanNumber_Integer(extractText_String(headerRenderer.subscriberCountText))),
 		description: "",
-		url: URL_BASE + headerRenderer.navigationEndpoint.browseEndpoint.canonicalBaseUrl,
+		url: idUrl,
+		urlAlternatives: [idUrl, canonicalUrl],
 		links: {}
 	});
 }
@@ -2093,10 +2124,11 @@ function extractVideoPage_VideoDetails(initialData, initialPlayerData, contextDa
 				if(!video.datetime || video.datetime <= 0) {
 					let date = 0;
 					
+					if (date <= 0 && renderer.relativeDateText?.simpleText)
+						date = extractAgoText_Timestamp(renderer.relativeDateText.simpleText);
 					if(date <= 0 && renderer.dateText?.simpleText)
 						date = extractDate_Timestamp(renderer.dateText.simpleText);
-					if(date <= 0 && renderer.relativeDateText?.simpleText)
-						date = extractAgoText_Timestamp(renderer.relativeDateText.simpleText);
+
 					video.datetime = date;
 				}
 			},
@@ -2150,9 +2182,10 @@ function extractVideoOwnerRenderer_AuthorLink(renderer) {
 	if(renderer.subscriberCountText)
 		subscribers = extractHumanNumber_Integer(extractText_String(renderer.subscriberCountText));
 	
-	return new PlatformAuthorLink(new PlatformID(PLATFORM, renderer?.navigationEndpoint?.browseEndpoint?.browseId, config.id, PLATFORM_CLAIMTYPE), 
+	const id = renderer?.navigationEndpoint?.browseEndpoint?.browseId;
+	return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id, PLATFORM_CLAIMTYPE), 
 		extractRuns_String(renderer.title.runs),
-		extractRuns_Url(renderer.title.runs),
+		(!id) ? extractRuns_Url(renderer.title.runs) : URL_BASE + "/channel/" + id,
 		bestThumbnail,
 		subscribers);
 }
@@ -2537,6 +2570,10 @@ function extractVideoWithContextRenderer_Video(videoRenderer, contextData) {
 		x.thumbnailOverlayTimeStatusRenderer?.accessibility?.accessibilityData?.label == "LIVE");
 	let isLive = liveBadges != null && liveBadges.length > 0;
 
+	let plannedDate = null;
+	if(videoRenderer.upcomingEventData?.startTime)
+		plannedDate = parseInt(videoRenderer.upcomingEventData.startTime);
+
 	//if(!isLive && !videoRenderer.publishedTimeText?.simpleText)
 	//	return  null; //Not a normal video
 
@@ -2557,20 +2594,20 @@ function extractVideoWithContextRenderer_Video(videoRenderer, contextData) {
 
 	const title = (videoRenderer.headline) ? extractText_String(videoRenderer.headline) : extractText_String(videoRenderer.title);
 
-	if(isLive)
+	if (isLive) {
 		return new PlatformVideo({
 			id: new PlatformID(PLATFORM, videoRenderer.videoId, config.id),
 			name: title,
 			thumbnails: extractThumbnail_Thumbnails(videoRenderer.thumbnail),
 			author: author,
-			uploadDate: parseInt(new Date().getTime()/1000),
+			uploadDate: plannedDate ?? parseInt(new Date().getTime() / 1000),
 			duration: 0,
 			viewCount: viewCount,
 			url: URL_BASE + "/watch?v=" + videoRenderer.videoId,
 			isLive: true,
 			extractType: "VideoWithContext"
 		});
-	else
+	} else {
 		return new PlatformVideo({
 			id: new PlatformID(PLATFORM, videoRenderer.videoId, config.id),
 			name: title,
@@ -2583,6 +2620,7 @@ function extractVideoWithContextRenderer_Video(videoRenderer, contextData) {
 			isLive: false,
 			extractType: "VideoWithContext"
 		});
+	}
 }
 function extractVideoRenderer_Video(videoRenderer, contextData) {
 
@@ -2733,7 +2771,7 @@ function extractVideoWithContextRenderer_AuthorLink(videoRenderer) {
 	const thumbUrl = channelThumbs && channelThumbs.length > 0 ? channelThumbs[0].url : null;
 	let channelUrl = videoRenderer.channelThumbnail?.channelThumbnailWithLinkRenderer?.navigationEndpoint?.browseEndpoint?.canonicalBaseUrl;
 	if(channelUrl) channelUrl = URL_BASE + channelUrl;
-
+	if (id) channelUrl = URL_BASE + "/channel/" + id;
 	return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id, PLATFORM_CLAIMTYPE), name, channelUrl, thumbUrl);
 }
 function extractVideoRenderer_AuthorLink(videoRenderer) {
@@ -2741,7 +2779,7 @@ function extractVideoRenderer_AuthorLink(videoRenderer) {
 	const name = extractRuns_String(videoRenderer.ownerText.runs);
 	const channelIcon = videoRenderer.channelThumbnailSupportedRenderers.channelThumbnailWithLinkRenderer;
 	const thumbUrl = channelIcon.thumbnail.thumbnails[0].url;
-	const channelUrl = extractRuns_Url(videoRenderer.ownerText.runs);
+	const channelUrl = (!id) ? extractRuns_Url(videoRenderer.ownerText.runs) : URL_BASE + "/channel/" + id;
 
 	return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id, PLATFORM_CLAIMTYPE), name, channelUrl, thumbUrl);
 }
@@ -2828,7 +2866,9 @@ function extractNavigationEndpoint_Url(navEndpoint, baseUrl) {
     if(!baseUrl)
         baseUrl = URL_BASE;
     if(!navEndpoint)
-        return null;
+		return null;
+	if(navEndpoint?.browseEndpoint?.browseId && navEndpoint?.browseEndpoint?.canonicalBaseUrl && navEndpoint.browseEndpoint.canonicalBaseUrl.startsWith("/@"))
+		return baseUrl + "/channel/" + navEndpoint?.browseEndpoint?.browseId;
     if(navEndpoint?.browseEndpoint?.canonicalBaseUrl)
         return baseUrl + navEndpoint?.browseEndpoint?.canonicalBaseUrl;
     if(navEndpoint.commandMetadata?.webCommandMetadata?.url)
diff --git a/diff b/diff
new file mode 100644
index 0000000..7f1af63
--- /dev/null
+++ b/diff
@@ -0,0 +1,235 @@
+--- YoutubeScript.js	2023-09-19 14:30:36.635400711 +0200
++++ ../../old/Youtube/YoutubeScript.js	2023-09-19 13:50:05.107878724 +0200
+@@ -32,7 +32,6 @@
+ const CIPHER_TEST_SUFFIX = "/player_ias.vflset/en_US/base.js";
+ 
+ const PLATFORM = "YouTube";
+-const PLATFORM_CLAIMTYPE = 2;
+ 
+ const BROWSE_TRENDING = "FEtrending";
+ const BROWSE_WHAT_TO_WATCH = "FEwhat_to_watch";
+@@ -278,27 +277,6 @@
+ 		throw new ScriptException("No search tab found");
+ }
+ 
+-source.getChannelUrlByClaim = (claimType, claimValues) => {
+-	const values = claimValues.values();
+-	if (values.length == 0)
+-		return null;
+-	const atName = values.find(x => x.startsWith("@"));
+-	if (atName)
+-		return URL_BASE + "/" + atName;
+-	else
+-		return URL_BASE + "/channel/" + values[0];
+-};
+-source.getChannelTemplateByClaimMap = () => {
+-	return {
+-		//Youtube
+-		2: {
+-			0: URL_BASE + "/{{CLAIMVALUE}}",
+-			1: URL_BASE + "/channel/{{CLAIMVALUE}}",
+-		}
+-	};
+-};
+-
+-
+ //Video
+ source.isContentDetailsUrl = (url) => {
+ 	return REGEX_VIDEO_URL_DESKTOP.test(url) || REGEX_VIDEO_URL_SHARE.test(url) || REGEX_VIDEO_URL_SHARE_LIVE.test(url) || REGEX_VIDEO_URL_SHORT.test(url);
+@@ -427,6 +405,7 @@
+ 
+ 	return finalResult;
+ };
++
+ source.getLiveChatWindow = function(url) {
+ 	const id = extractVideoIDFromUrl(url);
+ 	if(!id)
+@@ -491,7 +470,6 @@
+ 		this.playbackUrl = playerData.playbackTracking?.videostatsPlaybackUrl?.baseUrl;
+ 		if(!this.playbackUrl || !this.watchUrl)
+ 			throw new ScriptException("Playback tracking unavailable");
+-
+ 		this.playbackUrlBase = this.playbackUrl.substring(0, this.playbackUrl.indexOf("?"));
+ 		this.watchUrlBase = this.watchUrl.substring(0, this.watchUrl.indexOf("?"));
+ 		this.watchParams = parseQueryString(this.watchUrl);
+@@ -672,7 +650,7 @@
+ 	const initialData = requestInitialData(url, false, useAuth);
+ 	const channel = extractChannel_PlatformChannel(initialData, url);
+ 	const contextData = {
+-		authorLink: new PlatformAuthorLink(new PlatformID(PLATFORM, channel.id.value, config.id, PLATFORM_CLAIMTYPE), channel.name, channel.url, channel.thumbnail)
++		authorLink: new PlatformAuthorLink(new PlatformID(PLATFORM, channel.id.value, config.id), channel.name, channel.url, channel.thumbnail)
+ 	};
+ 	const tabs = extractPage_Tabs(initialData, contextData);
+ 	
+@@ -1766,7 +1744,7 @@
+ 	if(!url || !name)
+ 		return null;
+ 	else
+-		return new PlatformAuthorLink(new PlatformID(PLATFORM, null, config?.id, PLATFORM_CLAIMTYPE), name, url, thumbnail);
++		return new PlatformAuthorLink(new PlatformID(PLATFORM, null, config?.id), name, url, thumbnail);
+ }
+ /**
+  * Extract Subscription channels from a submenu obtained from subscriptionsPage
+@@ -1828,7 +1806,7 @@
+ 	const url = guideEntryRenderer.navigationEndpoint?.browseEndpoint?.canonicalBaseUrl ?
+ 		URL_BASE + guideEntryRenderer.navigationEndpoint?.browseEndpoint?.canonicalBaseUrl : null;
+ 
+-	return new PlatformAuthorLink(new PlatformID(PLATFORM, null, config.id, PLATFORM_CLAIMTYPE), name, url, thumbnail);
++	return new PlatformAuthorLink(new PlatformID(PLATFORM, null, config.id), name, url, thumbnail);
+ }
+ 
+ /**
+@@ -1870,7 +1848,7 @@
+ 	const banners = headerRenderer.banner?.thumbnails;
+ 	const bannerTargetWidth = 1080;
+ 	const banner = (banners && banners.length > 0) ? banners.sort((a,b)=>Math.abs(a.width - bannerTargetWidth) - Math.abs(b.width - bannerTargetWidth))[0] : { url: "" };
+-	
++
+ 	const idUrl = headerRenderer?.navigationEndpoint?.browseEndpoint?.browseId ?
+ 	    URL_BASE + "/channel/" + headerRenderer.navigationEndpoint.browseEndpoint.browseId :
+ 	    null;
+@@ -1879,7 +1857,7 @@
+ 	    null;
+ 
+ 	return new PlatformChannel({
+-		id: new PlatformID(PLATFORM, headerRenderer.channelId, config.id, PLATFORM_CLAIMTYPE),
++		id: new PlatformID(PLATFORM, headerRenderer.channelId, config.id),
+ 		name: headerRenderer.title ?? "",
+ 		thumbnail: thumbnail.url,
+ 		banner: banner.url,
+@@ -1943,7 +1921,7 @@
+ 		id: new PlatformID(PLATFORM, videoDetails.videoId, config.id),
+ 		name: videoDetails.title,
+ 		thumbnails: new Thumbnails(videoDetails.thumbnail?.thumbnails.map(x=>new Thumbnail(x.url, x.height)) ?? []),
+-		author: new PlatformAuthorLink(new PlatformID(PLATFORM, videoDetails.channelId, config.id, PLATFORM_CLAIMTYPE), videoDetails.author, URL_BASE + "/channel/" + videoDetails.channelId, null),
++		author: new PlatformAuthorLink(new PlatformID(PLATFORM, videoDetails.channelId, config.id), videoDetails.author, URL_BASE + "/channel/" + videoDetails.channelId, null),
+ 		duration: parseInt(videoDetails.lengthSeconds),
+ 		viewCount: parseInt(videoDetails.viewCount),
+ 		url: contextData.url,
+@@ -2124,11 +2102,10 @@
+ 				if(!video.datetime || video.datetime <= 0) {
+ 					let date = 0;
+ 					
+-					if (date <= 0 && renderer.relativeDateText?.simpleText)
++					if(date <= 0 && renderer.relativeDateText?.simpleText)
+ 						date = extractAgoText_Timestamp(renderer.relativeDateText.simpleText);
+ 					if(date <= 0 && renderer.dateText?.simpleText)
+ 						date = extractDate_Timestamp(renderer.dateText.simpleText);
+-
+ 					video.datetime = date;
+ 				}
+ 			},
+@@ -2183,7 +2160,8 @@
+ 		subscribers = extractHumanNumber_Integer(extractText_String(renderer.subscriberCountText));
+ 	
+ 	const id = renderer?.navigationEndpoint?.browseEndpoint?.browseId;
+-	return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id, PLATFORM_CLAIMTYPE), 
++
++	return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id), 
+ 		extractRuns_String(renderer.title.runs),
+ 		(!id) ? extractRuns_Url(renderer.title.runs) : URL_BASE + "/channel/" + id,
+ 		bestThumbnail,
+@@ -2570,10 +2548,10 @@
+ 		x.thumbnailOverlayTimeStatusRenderer?.accessibility?.accessibilityData?.label == "LIVE");
+ 	let isLive = liveBadges != null && liveBadges.length > 0;
+ 
++	
+ 	let plannedDate = null;
+ 	if(videoRenderer.upcomingEventData?.startTime)
+ 		plannedDate = parseInt(videoRenderer.upcomingEventData.startTime);
+-
+ 	//if(!isLive && !videoRenderer.publishedTimeText?.simpleText)
+ 	//	return  null; //Not a normal video
+ 
+@@ -2594,19 +2572,21 @@
+ 
+ 	const title = (videoRenderer.headline) ? extractText_String(videoRenderer.headline) : extractText_String(videoRenderer.title);
+ 
+-	if (isLive) {
++	if(isLive) {
+ 		return new PlatformVideo({
+ 			id: new PlatformID(PLATFORM, videoRenderer.videoId, config.id),
+ 			name: title,
+ 			thumbnails: extractThumbnail_Thumbnails(videoRenderer.thumbnail),
+ 			author: author,
+-			uploadDate: plannedDate ?? parseInt(new Date().getTime()/1000),			duration: 0,
++			uploadDate: plannedDate ?? parseInt(new Date().getTime()/1000),
++			duration: 0,
+ 			viewCount: viewCount,
+ 			url: URL_BASE + "/watch?v=" + videoRenderer.videoId,
+ 			isLive: true,
+ 			extractType: "VideoWithContext"
+ 		});
+-	} else {
++	}
++	else
+ 		return new PlatformVideo({
+ 			id: new PlatformID(PLATFORM, videoRenderer.videoId, config.id),
+ 			name: title,
+@@ -2619,7 +2599,6 @@
+ 			isLive: false,
+ 			extractType: "VideoWithContext"
+ 		});
+-	}
+ }
+ function extractVideoRenderer_Video(videoRenderer, contextData) {
+ 
+@@ -2733,7 +2712,7 @@
+ 
+ 	const subscribers = extractHumanNumber_Integer(extractText_String(channelRenderer.videoCountText));
+ 
+-	return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id, PLATFORM_CLAIMTYPE), name, channelUrl, thumbUrl, subscribers);
++	return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id), name, channelUrl, thumbUrl, subscribers);
+ }
+ 
+ function extractRuns_AuthorLink(runs) {
+@@ -2745,7 +2724,7 @@
+     const channelUrl = extractNavigationEndpoint_Url(runs[0]?.navigationEndpoint);
+     const thumbUrl = null;
+ 
+-	return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id, PLATFORM_CLAIMTYPE), name, channelUrl, thumbUrl ?? "");
++	return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id), name, channelUrl, thumbUrl ?? "");
+ }
+ 
+ function extractThumbnail_Thumbnails(thumbnail) {
+@@ -2770,8 +2749,9 @@
+ 	const thumbUrl = channelThumbs && channelThumbs.length > 0 ? channelThumbs[0].url : null;
+ 	let channelUrl = videoRenderer.channelThumbnail?.channelThumbnailWithLinkRenderer?.navigationEndpoint?.browseEndpoint?.canonicalBaseUrl;
+ 	if(channelUrl) channelUrl = URL_BASE + channelUrl;
+-	if (id) channelUrl = URL_BASE + "/channel/" + id;
+-	return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id, PLATFORM_CLAIMTYPE), name, channelUrl, thumbUrl);
++	if(id) channelUrl = URL_BASE + "/channel/" + id;
++
++	return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id), name, channelUrl, thumbUrl);
+ }
+ function extractVideoRenderer_AuthorLink(videoRenderer) {
+ 	const id = videoRenderer.channelThumbnailSupportedRenderers.channelThumbnailWithLinkRenderer?.navigationEndpoint?.browseEndpoint?.browseId;
+@@ -2780,7 +2760,7 @@
+ 	const thumbUrl = channelIcon.thumbnail.thumbnails[0].url;
+ 	const channelUrl = (!id) ? extractRuns_Url(videoRenderer.ownerText.runs) : URL_BASE + "/channel/" + id;
+ 
+-	return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id, PLATFORM_CLAIMTYPE), name, channelUrl, thumbUrl);
++	return new PlatformAuthorLink(new PlatformID(PLATFORM, id, config.id), name, channelUrl, thumbUrl);
+ }
+ function extractCommentRenderer_Comment(contextUrl, commentRenderer, replyCount, replyContinuation) {
+ 	const authorName = commentRenderer.authorText?.simpleText ?? "";
+@@ -2791,7 +2771,7 @@
+ 	);
+ 	return new YTComment({
+ 		contextUrl: contextUrl,
+-		author: new PlatformAuthorLink(new PlatformID(PLATFORM, null, config.id, PLATFORM_CLAIMTYPE), authorName, URL_BASE + authorEndpoint, authorThumbnail),
++		author: new PlatformAuthorLink(new PlatformID(PLATFORM, null, config.id), authorName, URL_BASE + authorEndpoint, authorThumbnail),
+ 		message: extractRuns_String(commentRenderer.contentText?.runs) ?? "",
+ 		rating: new RatingLikes(commentRenderer?.voteCount?.simpleText ? extractHumanNumber_Integer(commentRenderer.voteCount.simpleText) : 0),
+ 		date: (commentRenderer.publishedTimeText?.runs ? extractAgoTextRuns_Timestamp(commentRenderer.publishedTimeText.runs) : 0),
+@@ -2865,8 +2845,8 @@
+     if(!baseUrl)
+         baseUrl = URL_BASE;
+     if(!navEndpoint)
+-		return null;
+-	if(navEndpoint?.browseEndpoint?.browseId && navEndpoint?.browseEndpoint?.canonicalBaseUrl && navEndpoint.browseEndpoint.canonicalBaseUrl.startsWith("/@"))
++        return null;
++	if(navEndpoint?.browseEndpoint?.browseId && navEndpoint?.browseEndpoint?.canonicalBaseUrl && navEndpoint.browseEndpoint.canonicalBaseUrl.startsWith("/@"));
+ 		return baseUrl + "/channel/" + navEndpoint?.browseEndpoint?.browseId;
+     if(navEndpoint?.browseEndpoint?.canonicalBaseUrl)
+         return baseUrl + navEndpoint?.browseEndpoint?.canonicalBaseUrl;
diff --git a/twitch.png b/twitch.png
new file mode 100644
index 0000000000000000000000000000000000000000..73aec0e61f1ae4794b3ac9bd5d0370300d74fd24
GIT binary patch
literal 36314
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
LmY!Y`^Z9=PAMr$+

literal 0
HcmV?d00001

-- 
GitLab