From 0c0549bcc8aeca49385767f57f189d5315bde0ff Mon Sep 17 00:00:00 2001 From: Dinoosauro <80783030+Dinoosauro@users.noreply.github.com> Date: Wed, 4 Sep 2024 09:58:14 +0200 Subject: [PATCH] first commit --- .gitignore | 2 + README.md | 37 +++++++++++ main.js | 145 +++++++++++++++++++++++++++++++++++++++++++ manifest.json | 27 ++++++++ package.json | 5 ++ readme_assets/ui.jpg | Bin 0 -> 90695 bytes ui/icons/1 4.png | Bin 0 -> 588 bytes ui/icons/128.png | Bin 0 -> 3671 bytes ui/icons/48.png | Bin 0 -> 1486 bytes ui/icons/svg.svg | 2 + ui/index.html | 54 ++++++++++++++++ ui/script.js | 97 +++++++++++++++++++++++++++++ ui/style.css | 53 ++++++++++++++++ 13 files changed, 422 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 main.js create mode 100644 manifest.json create mode 100644 package.json create mode 100644 readme_assets/ui.jpg create mode 100644 ui/icons/1 4.png create mode 100644 ui/icons/128.png create mode 100644 ui/icons/48.png create mode 100644 ui/icons/svg.svg create mode 100644 ui/index.html create mode 100644 ui/script.js create mode 100644 ui/style.css diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..074ab52 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +package-lock.json +node_modules \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..cd94f5b --- /dev/null +++ b/README.md @@ -0,0 +1,37 @@ +# youtube-stream-saver + +Record parts of a YouTube video using the MediaRecorder API + +## Installation + +First, download the +[.zip file](https://codeload.github.com/Dinoosauro/youtube-stream-saver/zip/refs/heads/main) +of this repository. Then, follow the instructions for your browser. + +### Chromium: + +Go to the `chrome://extensions` page, and enable the `Developer mode` slider. +Extract the .zip file, and then on your browser click on the +`Load unpacked extension` button. Choose the directory where you've extracted +the .zip file, and the extension will be installed. + +### Firefox + +Go to `about:debugging#/runtime/this-firefox`, and click on the +`Load Temporary Add-on` button. Choose the .zip file, and the extension will be +installed. + +## Usage + +Click on the extension icon to open it. Then, you'll be able to choose the +codecs for the recording. You can adjust the bitrate and the interval of the key +frames, and finally you can start the recording. You can stop it at any time, +but it'll be automatically stopped: + +- When the video ends +- When the quality of the video is changed (or when an advertisement starts) + +**Note: The video bitrate won't be accurate, and probably the MediaRecorder +encoder will go over that.** + +![The extension UI](./readme_assets/ui.jpg) diff --git a/main.js b/main.js new file mode 100644 index 0000000..f43f40a --- /dev/null +++ b/main.js @@ -0,0 +1,145 @@ +/** + * The extension object + * @type chrome + */ +const browserToUse = typeof chrome === "undefined" ? browser : chrome; +let settings = { + audioBitsPerSecond: 192_000, + videoBitsPerSecond: 2_500_000, + mimeType: null, + videoKeyFrameIntervalDuration: 5 +} +/** + * + * @returns An array of the available codecs. Each array has a "type" key, with its value as a [string with the mimetype to replace, string with the name to show in the UI] and "containers" object, with a string[][] composed of [[the container mimetype, the name to show]] + */ +function checkAvailableMimetypes() { + const codecs = { + video: [["vp9", "VP9 Video"], ["avc1", "H264 Video"], ["vp8", "VP8 Video"], ["av1", "AV1 Video"], ["hev1", "H265 Video"], ["", ""]], + audio: [["opus", "Opus Audio"], ["pcm", "PCM Audio"], ["mp4a", "AAC Audio"], [""]], + container: [["webm", "WebM"], ["ogg", "OGG"], ["mp4", "MP4"], ["x-matroska", "Matroska"]] + } + const output = []; + for (const [video, videoDesc] of codecs.video) { + for (const [audio, audioDesc] of codecs.audio) { + if (video === "" && audio === "") continue; + for (const container of codecs.container) { + const stringToTest = `${video === "" ? "audio" : "video"}/${container[0]}; codecs=${video === "" ? "" : `"${video}"`}${video !== "" && audio !== "" ? "," : ""}${audio === "" ? "" : `"${audio}"`}` + if (MediaRecorder.isTypeSupported(stringToTest)) { + const generalString = stringToTest.replace(container[0], "$container");; + const index = output.findIndex(field => field.type[0] === generalString); + if (index !== -1) output[index].containers.push(container); else output.push({ type: [generalString, `${video === "" ? "" : videoDesc}${video !== "" && audio !== "" ? " + " : ""}${audio === "" ? "" : audioDesc}`], containers: [container] }); + } + } + } + } + return output; +} +/** + * The object used for recording the video stream + * @type MediaRecorder + */ +let mediaRecorder = null; +/** + * The chunks of the recorded video. Note that nothing is added if the File System API is used. + */ +let chunks = []; +/** + * The name of the output file + */ +let suggestedName = crypto?.randomUUID() ?? Math.random(); +/** + * The Writable of the file the user has selected. This is only used for the File System API + * @type FileSystemWritableFileStream + */ +let fileWritable; +/** + * The position where the new chunk should be written + */ +let writePosition = 0; +/** + * Stop the recording. This is used so that, if the source changes, the recording of the new source will be started automatically. + */ +let forceStop = false; +/** + * The main function, that starts the recording of the video + */ +async function startContent() { + const video = document.querySelector("video"); + /** + * The extension of the output file (without the dot) + */ + const extension = (settings.mimeType ? settings.mimeType.substring(settings.mimeType.indexOf("/") + 1, settings.mimeType.indexOf(";")) : checkAvailableMimetypes()[0].containers[0][1]).replace("x-matroska", "mkv"); + video.addEventListener("ended", () => { + mediaRecorder.stop(); + }); + const [title, channel, id, channelLink] = [document.querySelector("#title > h1 > yt-formatted-string")?.textContent, document.querySelector("#upload-info > #channel-name a")?.textContent, new URLSearchParams(window.location.search).get("v"), document.querySelector("#upload-info > #channel-name a").href] + if (title && channel && id) suggestedName = `${title} [${id}]`; + forceStop = false; + if (video !== null) { // Start the cappture + const stream = typeof video.captureStream !== "undefined" ? video.captureStream() : video.mozCaptureStream(); // Firefox has a different name for the captureStream function + for (const key in settings) settings[key] = parseInt(settings[key]) || undefined; // Delete null, NaN or "" placeholders + try { // Try saving the file using the File System API. If not available, the standard link method will be used. + fileWritable = await (await window.showSaveFilePicker({ id: channelLink.substring(channelLink.lastIndexOf("/") + 1).replace("@", "").substring(0, 32), suggestedName: `${suggestedName}.${extension}` })).createWritable(); + } catch (ex) { + + } + mediaRecorder = new MediaRecorder(stream, { ...settings }); // Initialize the new MediaRecorder + mediaRecorder.ondataavailable = fileWritable ? async (event) => { // Since a Writable is being used, the file will be directly written on the device + event.data.size > 0 && fileWritable.write({ data: event.data, position: writePosition, type: "write" }); + writePosition += event.data.size; + } : (event) => { // No Writable is being used. So, we'll add the Blob to an array + event.data.size > 0 && chunks.push(event.data); + }; + mediaRecorder.onstop = async () => { + if (!fileWritable) { + const blob = new Blob(chunks, { type: `video/${extension}` }); // Create the output blob with all the merged files + const a = document.createElement("a"); // And download it using a link + a.href = URL.createObjectURL(blob); + a.download = `${suggestedName}.${extension}`; + a.click(); + URL.revokeObjectURL(a.href); + } else await fileWritable.close(); // If the File System API is being used, just close the writable. + // Restore the values at their original value + chunks = []; + mediaRecorder = null; + fileWritable = null; + writePosition = 0; + suggestedName = crypto?.randomUUID() ?? Math.random(); + browserToUse.runtime.sendMessage(browserToUse.runtime.id, { action: "running", content: false }); // Say to the extension that the conversion has ended + !video.paused && !forceStop && startContent(); // If the user hasn't manually stopped the video, and it's still playing, start a new reproduction. + }; + mediaRecorder.start(fileWritable ? 500 : undefined); + browserToUse.runtime.sendMessage(browserToUse.runtime.id, { action: "running", content: true }); + } +} + +browserToUse.runtime.onMessage.addListener((msg) => { + switch (msg.action) { + case "start": + if (mediaRecorder instanceof MediaRecorder) mediaRecorder.stop(); + startContent(); + break; + case "stop": + if (mediaRecorder instanceof MediaRecorder) { + forceStop = true; + mediaRecorder.stop(); + } + break; + case "running": + browserToUse.runtime.sendMessage(browserToUse.runtime.id, { action: "running", content: mediaRecorder !== null }) + break; + case "getAvailableCodecs": + browserToUse.runtime.sendMessage(browserToUse.runtime.id, { action: "getAvailableCodecs", content: checkAvailableMimetypes() }) + break; + case "updateFields": + settings = { ...settings, ...msg.content } + break; + } +}); +(async () => { // Update the settings by fetching the values in the sync storage + const result = await browserToUse.storage.sync.get(Object.keys(settings)); + for (const key in result) { + settings[key] = result[key] || settings[key]; + } +})() \ No newline at end of file diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..665beb4 --- /dev/null +++ b/manifest.json @@ -0,0 +1,27 @@ +{ + "manifest_version": 3, + "name": "YouTube Stream Saver", + "description": "Save the YouTube stream on your device by re-encoding it while playing the video", + "version": "1", + "action": { + "default_popup": "./ui/index.html" + }, + "permissions": [ + "storage" + ], + "content_scripts": [ + { + "js": [ + "main.js" + ], + "matches": [ + "https://*.youtube.com/*" + ] + } + ], + "browser_specific_settings": { + "gecko": { + "id": "{eb5affd7-77c8-48ca-bf98-5fbe1d72bedf}" + } + } +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..dc5d38f --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "@types/chrome": "^0.0.270" + } +} diff --git a/readme_assets/ui.jpg b/readme_assets/ui.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de175cae6c7ebcd666ace02bf306f2f2c61c5bf9 GIT binary patch literal 90695 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

GynfD-}!&_ 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 OYFZq6!PKB~(@g;77Rn|7 literal 0 HcmV?d00001 diff --git a/ui/icons/1 4.png b/ui/icons/1 4.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e0434aef08e6ee621341a2fa25115bd539f4aa GIT binary patch literal 588 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|EK(yp(|mmy zw18|52FCVG1{RPKAeI7R1_q`DOmGo_15{5ZuPm!?|aJ`|LweRDZOuNYPE~kRtB#v2HQ23{+J?SRWpmX zrDs>>gtb3I`45>1%@JDgPHl^Ui7R{0a(|K0yXyig z`YoFeDSSF<$64@o_K7&)PHv7wdz6KfB(z-5s$*a;bwr%Ca=} zzC{~fuKf6kQ&*wDaiy;H$+;iQtu366UE$d!ed7j4#6*T26U{H$rZ(4K+7bREQGzpG z)oY?D`?tM?<`r5~7fj$|NoOhgl2?^_+BYZR9b2PAi2N(9`gzg&68Y)_a-M$Kp5C$L zNtm46)U#(Ljd(c%#T8_QPb59xURI`-{_|3Q(fM(R6$>y>19!*wXJE;n{U z$$XclRp&i+ELgwpWVLiv%YloI%luz!7~D=!4l$|M&zIV1?5=+QuC(IR{oCSnbq=0B zZhc|##1CH&yY5O&czo3V>dl7}e{a7Y*!aj-?<*tqBU2!~zeHJKI NJzf1=);T3K0RS+`?HB+6 literal 0 HcmV?d00001 diff --git a/ui/icons/128.png b/ui/icons/128.png new file mode 100644 index 0000000000000000000000000000000000000000..38731c111c2a287c9c7ad44ba7214d9d2735fdcd GIT binary patch literal 3671 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 literal 0 HcmV?d00001 diff --git a/ui/icons/svg.svg b/ui/icons/svg.svg new file mode 100644 index 0000000..38ea048 --- /dev/null +++ b/ui/icons/svg.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/ui/index.html b/ui/index.html new file mode 100644 index 0000000..ef1a642 --- /dev/null +++ b/ui/index.html @@ -0,0 +1,54 @@ + + + + + + YouTube Stream Saver + + + +
+
+ +

YouTube Stream Saver

+
+

Record YouTube's video stream and save the result on your device

+
+
+
+

The extension doesn't have access to YouTube

+

Please grant the authorization to read the YouTube webpage to make it work.

+ +
+
+
+

Settings:

+
+
+ +

Output codec:

+ +

Output container:

+ +

+ +
+
+

The video is being recorded...

+

The recording will automatically stop at the end of the video.


+ +
+

+ Icons from Microsoft's
Fluent UI System Icons. This project is in no way affiliated with YouTube, that is a trademark of Google. +
+ + + \ No newline at end of file diff --git a/ui/script.js b/ui/script.js new file mode 100644 index 0000000..6196bbc --- /dev/null +++ b/ui/script.js @@ -0,0 +1,97 @@ +(async () => { + /** + * The browser interface to use + * @type chrome + */ + const browserToUse = typeof chrome === "undefined" ? browser : chrome; + /** + * A list of the available codecs. It's composed by a "type" key, with a string[] that contains [the mimetype, and the string to show]; and by a "containers" key, with a string[][] that contains [["the mimetype of the container", "the name of the container to show"]] + */ + let codecs = []; + /** + * The Select where the user can choose the codec option + * @type HTMLSelectElement + */ + const select = document.getElementById("resolution"); + /** + * The Select where the user can choose the container of the output file + * @type HTMLSelectElement + */ + const container = document.getElementById("container"); + /** + * The string of the output codec chosen + */ + let outputCodec = ""; + const ids = await browserToUse.tabs.query({ active: true }); + /** + * If Settings are being restored. This is used so that the value of the container won't be updated every time from the Settings + */ + let settingsRestore = true; + select.onchange = () => { + container.innerHTML = ""; + browserToUse.storage.sync.set({ availableMetadataIndex: select.value }); + if (select.value === "-1") { // The default mimetype + browserToUse.tabs.sendMessage(ids[0].id, { action: "updateFields", content: { mimeType: null } }) + return; + } + for (const [containerType, containerName] of codecs[+select.value].containers) { + const option = document.createElement("option"); + option.textContent = containerName; + option.value = containerType; + container.append(option); + } + if (settingsRestore) { + container.value = syncProperties.chosenContainer.toString(); + settingsRestore = false; + } + container.dispatchEvent(new Event("change")); + } + container.onchange = () => { + outputCodec = codecs[+select.value].type[0].replace("$container", container.value); + browserToUse.tabs.sendMessage(ids[0].id, { action: "updateFields", content: { mimeType: outputCodec } }); + browserToUse.storage.sync.set({ chosenContainer: container.value }); + } + browserToUse.runtime.onMessage.addListener((msg) => { + switch (msg.action) { + case "running": + for (const item of document.querySelectorAll("[data-result-show]")) { + const type = item.getAttribute("data-result-show") + item.style.display = (msg.content && type === "1") || (!msg.content && type === "0") ? "block" : "none"; + } + break; + case "getAvailableCodecs": + codecs = msg.content; + select.innerHTML = ""; + msg.content.forEach(({ type }, i) => { // Create an option for every available codec + const option = document.createElement("option"); + option.textContent = type[1]; + option.value = i; + select.append(option); + }); + select.value = syncProperties.availableMetadataIndex; + select.dispatchEvent(new Event("change")); + break; + } + }); + document.getElementById("start").onclick = () => browserToUse.tabs.sendMessage(ids[0].id, { action: "start" }); + document.getElementById("stop").onclick = () => browserToUse.tabs.sendMessage(ids[0].id, { action: "stop" }); + const syncProperties = await browserToUse.storage.sync.get(["availableMetadataIndex", "chosenContainer", ...Array.from(document.querySelectorAll("[data-settings]")).map(item => item.getAttribute("data-settings"))]); // The first two properties contain the value of the two selects. + for (const item of document.querySelectorAll("[data-settings]")) { + const prop = item.getAttribute("data-settings"); + item.value = syncProperties[prop] ?? item.getAttribute("data-default-value"); + item.addEventListener("change", () => { + browserToUse.storage.sync.set({ [prop]: item.value }); + browserToUse.tabs.sendMessage(ids[0].id, { action: "updateFields", content: { [prop]: item.value } }) + }); + } + document.getElementById("grantAccess").onclick = async () => { // Request the access to the YouTube webpage + await browserToUse.permissions.request({ origins: ["https://*.youtube.com/*"] }); + checkPermission(); + } + async function checkPermission() { // Check if the user has granted permission to the extension to access the YouTube webpage, so that, if false, a warning on the extension UI will be shown. + document.getElementById("requireAccess").style.display = await browserToUse.permissions.contains({ origins: ["https://*.youtube.com/*"] }) ? "none" : "block"; + } + checkPermission(); + browserToUse.tabs.sendMessage(ids[0].id, { action: "running" }); + browserToUse.tabs.sendMessage(ids[0].id, { action: "getAvailableCodecs" }); +})(); diff --git a/ui/style.css b/ui/style.css new file mode 100644 index 0000000..caed2eb --- /dev/null +++ b/ui/style.css @@ -0,0 +1,53 @@ +:root { + --background: #151515; + --text: #fafafa; + --card: #313131; + --input: #515151; + --accent: #167b65; + --font: "Work Sans", sans-serif; +} +body { + padding: 10px; + background-color: var(--background); + color: var(--text); + font-family: var(--font); +} +.card { + padding: 15px 10px; + background-color: var(--card); + border-radius: 8px; +} +.flex { + display: flex; +} +.hcenter { + align-items: center; +} +.gap { + gap: 10px; +} +button, input, select { + background-color: var(--accent); + border: 1px solid var(--text); + border-radius: 8px; + font-family: var(--font); + transition: filter 0.2s ease-in-out; + width: 100%; + width: -webkit-fill-available; + width: -moz-available; + color: var(--text); + padding: 10px; +} +button:hover { + cursor: pointer; + filter: brightness(125%); +} +button:active { + filter: brightness(150%); +} +input, select { + background-color: var(--input); +} +a { + color: var(--text); +} \ No newline at end of file