From 5920f4a49709c2d7074e11c42d26a57ace57e474 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20R=C3=A8gne?= Date: Sun, 25 Sep 2022 14:22:01 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20G=C3=A9rer=20les=20shorts=20de=20YouTub?= =?UTF-8?q?e.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/scraper/youtube.js | 18 +++++++++++++++ test/integration/scraper/youtube.js | 31 +++++++++++++++++++++++++ test/unit/core/scraper/youtube.js | 36 ++++++++++++++++++++++++++++- 3 files changed, 84 insertions(+), 1 deletion(-) diff --git a/src/core/scraper/youtube.js b/src/core/scraper/youtube.js index 450298d4..4f2e5472 100644 --- a/src/core/scraper/youtube.js +++ b/src/core/scraper/youtube.js @@ -95,3 +95,21 @@ const actionMinify = async function ({ pathname }, _content, { incognito }) { return plugin.generateVideoUrl(pathname.slice(1), incognito); }; export const extractMinify = matchPattern(actionMinify, "*://youtu.be/*"); + +/** + * Extrait les informations nécessaire pour lire une vidéo sur Kodi. + * + * @param {URL} url L'URL d'un short YouTube. + * @param {Object} _content Le contenu de l'URL. + * @param {Object} options Les options de l'extraction. + * @param {boolean} options.incognito La marque indiquant si l'utilisateur est + * en navigation privée. + * @returns {Promise} Une promesse contenant le lien du + * fichier. + */ +const actionShort = async function ({ pathname }, _content, { incognito }) { + return plugin.generateVideoUrl(pathname.slice(8), incognito); +}; +export const extractShort = matchPattern(actionShort, + "*://*.youtube.com/shorts/*", + "*://youtube.com/shorts/*"); diff --git a/test/integration/scraper/youtube.js b/test/integration/scraper/youtube.js index db5f37b9..286db18e 100644 --- a/test/integration/scraper/youtube.js +++ b/test/integration/scraper/youtube.js @@ -231,4 +231,35 @@ describe("Scraper: YouTube", function () { assert.strictEqual(stub.callCount, 1); assert.deepStrictEqual(stub.firstCall.args, ["video"]); }); + + it("should return video id from short", async function () { + const stub = sinon.stub(kodi.addons, "getAddons").resolves([]); + + const url = new URL("https://www.youtube.com/shorts/Oq98KDthqyk"); + const options = { depth: false, incognito: false }; + + const file = await extract(url, options); + assert.strictEqual(file, + "plugin://plugin.video.youtube/play/" + + "?video_id=Oq98KDthqyk&incognito=false"); + + assert.strictEqual(stub.callCount, 1); + assert.deepStrictEqual(stub.firstCall.args, ["video"]); + }); + + it("should return video id from short shared", async function () { + const stub = sinon.stub(kodi.addons, "getAddons").resolves([]); + + const url = new URL("https://youtube.com/shorts/rP34nI3E3bc" + + "?feature=share"); + const options = { depth: false, incognito: false }; + + const file = await extract(url, options); + assert.strictEqual(file, + "plugin://plugin.video.youtube/play/" + + "?video_id=rP34nI3E3bc&incognito=false"); + + assert.strictEqual(stub.callCount, 1); + assert.deepStrictEqual(stub.firstCall.args, ["video"]); + }); }); diff --git a/test/unit/core/scraper/youtube.js b/test/unit/core/scraper/youtube.js index 054fa895..980bc377 100644 --- a/test/unit/core/scraper/youtube.js +++ b/test/unit/core/scraper/youtube.js @@ -286,7 +286,7 @@ describe("core/scraper/youtube.js", function () { assert.deepStrictEqual(stub.firstCall.args, ["video"]); }); - it("should return video id form invidio.us", async function () { + it("should return video id from invidio.us", async function () { const stub = sinon.stub(kodi.addons, "getAddons").resolves([]); const url = new URL("https://invidio.us/embed/foo"); @@ -336,4 +336,38 @@ describe("core/scraper/youtube.js", function () { assert.deepStrictEqual(stub.firstCall.args, ["video"]); }); }); + + describe("extractShort()", function () { + it("should return video id", async function () { + const stub = sinon.stub(kodi.addons, "getAddons").resolves([]); + + const url = new URL("https://www.youtube.com/shorts/foo"); + const content = undefined; + const options = { incognito: false }; + + const file = await scraper.extractShort(url, content, options); + assert.strictEqual(file, + "plugin://plugin.video.youtube/play/" + + "?video_id=foo&incognito=false"); + + assert.strictEqual(stub.callCount, 1); + assert.deepStrictEqual(stub.firstCall.args, ["video"]); + }); + + it("should return video id from URL without 'www'", async function () { + const stub = sinon.stub(kodi.addons, "getAddons").resolves([]); + + const url = new URL("https://youtube.com/shorts/foo"); + const content = undefined; + const options = { incognito: false }; + + const file = await scraper.extractShort(url, content, options); + assert.strictEqual(file, + "plugin://plugin.video.youtube/play/" + + "?video_id=foo&incognito=false"); + + assert.strictEqual(stub.callCount, 1); + assert.deepStrictEqual(stub.firstCall.args, ["video"]); + }); + }); });