/** * Copyright (C) 2021, Wojtek Kosior * * This program is free software: you can redistribute it and/or modify * it under the terms of the CC0 1.0 Universal License as published by * the Creative Commons Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * CC0 1.0 Universal License for more details. * Available under the terms of Creative Commons Zero. */ /* Use with https://www.youtube.com/*** */ /* Redirect youtube.com to yewtu.be */ function decode_query_options(url) { const query_options = {}; const match = /^[^?]*\?(.*)/.exec(url); if (!match) return query_options; for (const opt of match[1].split("&")) { const [key, val] = /^([^=]*)=?(.*)/.exec(opt).splice(1, 2).map(decodeURIComponent); query_options[key] = val; } return query_options; } function encode_query_options(query_options) { return Object.entries(query_options) .map(ar => ar.map(encodeURIComponent).join("=")).join("&"); } function remake_url(youtube_url) { const query_options = decode_query_options(youtube_url); let endpoint = ""; const match = /^(?:(?:https?)?\/\/)?[^/]*\/([^?]*)/.exec(youtube_url); if (match) endpoint = match[1]; if (/^embed\//.test(query_options.v)) endpoint = query_options.v; if (/^embed\/.+/.test(endpoint)) delete query_options.v const encoded_options = encode_query_options(query_options); return `https://yewtu.be/${endpoint}?${encoded_options}`; } window.location.href = remake_url(document.URL);