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"]);
+ });
+ });
});