diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8dea263 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/dist/ +.amo-upload-uuid \ No newline at end of file diff --git a/background.js b/background.js index b2a85d4..e1c7b56 100644 --- a/background.js +++ b/background.js @@ -1,18 +1,73 @@ "use strict"; -const WINDOWS_CHROME_UA = - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + - "AppleWebKit/537.36 (KHTML, like Gecko) " + - "Chrome/140.0.0.0 Safari/537.36"; +const CHROME_VERSION = "140.0.0.0"; +const TARGET_HOSTS = [ + "netflix.com", + "assets.nflxext.com" +]; -browser.webRequest.onBeforeSendHeaders.addListener( +function getOperatingSystem() { + const ua = globalThis.navigator?.userAgent || ""; + const platform = globalThis.navigator?.platform || ""; + const userAgentDataPlatform = globalThis.navigator?.userAgentData?.platform || ""; + + if (/Windows/i.test(ua) || /Win/i.test(platform) || /win/i.test(userAgentDataPlatform)) { + return "win"; + } + + if (/Mac/i.test(ua) || /Mac/i.test(platform) || /mac/i.test(userAgentDataPlatform)) { + return "mac"; + } + + if (/Linux/i.test(ua) || /Linux/i.test(platform) || /linux/i.test(userAgentDataPlatform)) { + return "linux"; + } + + return "linux"; +} + +function getChromeLikeUserAgent() { + const os = getOperatingSystem(); + + switch (os) { + case "mac": + return `Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${CHROME_VERSION} Safari/537.36`; + case "win": + return `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${CHROME_VERSION} Safari/537.36`; + case "linux": + default: + return `Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${CHROME_VERSION} Safari/537.36`; + } +} + +function isTargetHost(url) { + try { + const hostname = new URL(url).hostname.toLowerCase(); + + return hostname === "netflix.com" || + hostname.endsWith(".netflix.com") || + hostname === "assets.nflxext.com" || + hostname.endsWith(".nflxext.com"); + } catch { + return false; + } +} + +const browserApi = globalThis.browser || globalThis.chrome; + +browserApi.webRequest.onBeforeSendHeaders.addListener( (details) => { + if (!isTargetHost(details.url)) { + return {}; + } + const requestHeaders = details.requestHeaders ?? []; + const userAgentValue = getChromeLikeUserAgent(); let foundUserAgent = false; for (const header of requestHeaders) { if (header.name.toLowerCase() === "user-agent") { - header.value = WINDOWS_CHROME_UA; + header.value = userAgentValue; foundUserAgent = true; break; } @@ -21,7 +76,7 @@ browser.webRequest.onBeforeSendHeaders.addListener( if (!foundUserAgent) { requestHeaders.push({ name: "User-Agent", - value: WINDOWS_CHROME_UA + value: userAgentValue }); } @@ -30,7 +85,9 @@ browser.webRequest.onBeforeSendHeaders.addListener( { urls: [ "*://netflix.com/*", - "*://*.netflix.com/*" + "*://*.netflix.com/*", + "*://assets.nflxext.com/*", + "*://*.nflxext.com/*" ] }, [ diff --git a/manifest.json b/manifest.json index 033612b..2aa77c5 100644 --- a/manifest.json +++ b/manifest.json @@ -1,8 +1,8 @@ { "manifest_version": 3, - "name": "thisiswindowschromiumnetflix", - "version": "1.0.0", - "description": "Netflix에서 User-Agent를 Windows Chrome으로 고정합니다.", + "name": "thisischromiumnetflix", + "version": "2026.7.27.1", + "description": "Netflix 관련 요청의 User-Agent를 운영체제에 맞춰 조정합니다.", "permissions": [ "webRequest", @@ -23,7 +23,7 @@ "browser_specific_settings": { "gecko": { "id": "thisiswindowschromiumnetflix@imnya.ng", - "strict_min_version": "109.0", + "strict_min_version": "142.0", "data_collection_permissions": { "required": [ "none" @@ -31,4 +31,4 @@ } } } -} \ No newline at end of file +}