diff --git a/utils/eventLogger/getFilePath.test.ts b/utils/eventLogger/getFilePath.test.ts new file mode 100644 index 000000000..b575e824b --- /dev/null +++ b/utils/eventLogger/getFilePath.test.ts @@ -0,0 +1,46 @@ +import getFilePath from "./getFilePath"; + +test("YouTube Video IDが得られる", () => { + expect( + getFilePath({ + providerUrl: "https://www.youtube.com/", + url: "https://www.youtube.com/watch?v=aqz-KE-bpKQ", + }) + ).toBe("aqz-KE-bpKQ"); +}); + +test("Vimeo Video IDが得られる", () => { + expect( + getFilePath({ + providerUrl: "https://vimeo.com/", + url: "https://vimeo.com/253989945", + }) + ).toBe("253989945"); +}); + +test("Wowzaのファイルパスが得られる", () => { + expect( + getFilePath({ + providerUrl: "https://example/", + url: "https://example/api/v2/wowza/sample.mp4", + }) + ).toBe("sample.mp4"); +}); + +test("YouTube Video IDの取得失敗", () => { + expect( + getFilePath({ + providerUrl: "https://www.youtube.com/", + url: "https://www.youtube.com/", + }) + ).toBe(undefined); +}); + +test("URLが空", () => { + expect( + getFilePath({ + providerUrl: "https://vimeo.com/", + url: "", + }) + ).toBe(undefined); +}); diff --git a/utils/eventLogger/getFilePath.ts b/utils/eventLogger/getFilePath.ts new file mode 100644 index 000000000..689793d8f --- /dev/null +++ b/utils/eventLogger/getFilePath.ts @@ -0,0 +1,27 @@ +import getValidUrl from "$utils/getValidUrl"; + +/** + * ビデオリソースURLをv1イベントオブジェクトのfileパラメーターに変換 + * @param e.providerUrl 動画プロバイダーの識別子 + * @param e.url URL + * @return v1イベントオブジェクトのfileパラメーター + */ +function getFilePath({ + providerUrl, + url, +}: { + providerUrl: string | null; + url: string; +}) { + const validUrl = getValidUrl(url); + // TODO: URLの取得に失敗し "" が得られる不具合が解決すればこの処理はおそらく不要 + if (!validUrl) return; + + if (providerUrl === "https://www.youtube.com/") { + return new URLSearchParams(url.split("?")[1]).get("v") ?? undefined; + } + + return validUrl.pathname.replace(/^\/(?:api\/v2\/wowza\/)?/, ""); +} + +export default getFilePath; diff --git a/utils/eventLogger/logger.ts b/utils/eventLogger/logger.ts index fd701b442..ecdf408a2 100644 --- a/utils/eventLogger/logger.ts +++ b/utils/eventLogger/logger.ts @@ -2,6 +2,7 @@ import type { EventType } from "$server/models/event"; import { api } from "$utils/api"; import { PlayerEvent, PlayerEvents, PlayerTracker } from "./playerTracker"; import { load } from "./loggerSessionPersister"; +import getFilePath from "./getFilePath"; /** v1のときのトラッキング用コードの移植 */ function send(eventType: EventType, event: PlayerEvent, detail?: string) { @@ -12,10 +13,7 @@ function send(eventType: EventType, event: PlayerEvent, detail?: string) { const body = { event: eventType, detail, - file: - event.providerUrl === "https://www.youtube.com/" - ? new URLSearchParams(event.url.split("?")[1]).get("v") ?? undefined - : new URL(event.url).pathname.replace(/^\/(?:api\/v2\/wowza\/)?/, ""), + file: getFilePath(event), query: event.url.split("?")[1], current: event.currentTime.toString(), rid: id(ltiLaunchBody.resource_link_id), diff --git a/utils/getValidUrl.ts b/utils/getValidUrl.ts new file mode 100644 index 000000000..dd6390363 --- /dev/null +++ b/utils/getValidUrl.ts @@ -0,0 +1 @@ +export { default } from "$server/utils/getValidUrl";