From 6568439469b05cef01de3889b67b5a60d76efdbf Mon Sep 17 00:00:00 2001 From: vyneer Date: Wed, 27 Dec 2023 14:42:55 +0300 Subject: [PATCH] feat: strip tracking params from youtube links --- assets/chat/js/formatters/UrlFormatter.js | 11 +++++-- .../chat/js/formatters/UrlFormatter.test.js | 32 ++++++++++++++++++- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/assets/chat/js/formatters/UrlFormatter.js b/assets/chat/js/formatters/UrlFormatter.js index 7b182d44..6a69e8c6 100644 --- a/assets/chat/js/formatters/UrlFormatter.js +++ b/assets/chat/js/formatters/UrlFormatter.js @@ -71,8 +71,7 @@ export default class UrlFormatter { const decodedUrl = self.elem.html(url).text(); const m = decodedUrl.match(self.linkregex); if (m) { - const encodedUrl = self.encodeUrl(m[0]); - const normalizedUrl = this.normalizeUrl(encodedUrl); + const normalizedUrl = self.encodeUrl(this.normalizeUrl(m[0])); let embedHashLink = ''; try { @@ -114,6 +113,14 @@ export default class UrlFormatter { return url.split('?')[0]; } + if (/youtu(?:be\.com|\.be)/i.test(url)) { + // Same as with xeets, remove the nasty share tracking query param + // from YouTube links. + const ytLink = new URL(url); + ytLink.searchParams.delete('si'); + return ytLink.href; + } + return url; } } diff --git a/assets/chat/js/formatters/UrlFormatter.test.js b/assets/chat/js/formatters/UrlFormatter.test.js index 1b9400ae..5dd9253b 100644 --- a/assets/chat/js/formatters/UrlFormatter.test.js +++ b/assets/chat/js/formatters/UrlFormatter.test.js @@ -21,7 +21,37 @@ describe('Normalizing URLs', () => { ); }); - test("Don't modify a URL that isn't Twitter or X", () => { + test('Remove the share tracking query param from a youtube.com link', () => { + expect( + urlFormatter.normalizeUrl( + 'https://www.youtube.com/live/2NjXXQYtUNY?si=5ALpT28ptRec6T7u&t=70', + ), + ).toBe('https://www.youtube.com/live/2NjXXQYtUNY?t=70'); + }); + + test('Remove the share tracking query param from a youtu.be link', () => { + expect( + urlFormatter.normalizeUrl( + 'https://youtu.be/SbPP1i6INPk?si=K0qpdHBGOIJ-gBMK&t=60', + ), + ).toBe('https://youtu.be/SbPP1i6INPk?t=60'); + }); + + test("Don't modify a youtube.com link that doesn't contain the share tracking query param", () => { + expect( + urlFormatter.normalizeUrl( + 'https://www.youtube.com/live/2NjXXQYtUNY?t=70', + ), + ).toBe('https://www.youtube.com/live/2NjXXQYtUNY?t=70'); + }); + + test("Don't modify a youtu.be link that doesn't contain the share tracking query param", () => { + expect(urlFormatter.normalizeUrl('https://youtu.be/SbPP1i6INPk?t=60')).toBe( + 'https://youtu.be/SbPP1i6INPk?t=60', + ); + }); + + test("Don't modify a URL that isn't Twitter, X or YouTube", () => { expect( urlFormatter.normalizeUrl('https://www.twitch.tv/search?term=vtuber'), ).toBe('https://www.twitch.tv/search?term=vtuber');