Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: Build Extension

on:
push:
branches:
- '**'
pull_request:

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 9

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Lint
run: pnpm eslint .

- name: Build
run: pnpm build

- name: Upload chrome build artifact
uses: actions/upload-artifact@v4
with:
name: chrome-mv3-dist
path: dist/chrome-mv3
if-no-files-found: error
64 changes: 63 additions & 1 deletion src/entrypoints/background.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,69 @@
import type { DownloadMessage, MessageType } from '../types/message'
import { DEFAULT_OPTIONS, getOption } from '../types/options'

const CHZZK_USER_AGENT_RULE_ID = 1001
const CHZZK_USER_AGENT =
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36 OPR/65.0.3467.48'

const setChzzkUserAgentRule = async (enabled: boolean): Promise<void> => {
await chrome.declarativeNetRequest.updateDynamicRules({
removeRuleIds: [CHZZK_USER_AGENT_RULE_ID],
addRules: enabled
? [
{
id: CHZZK_USER_AGENT_RULE_ID,
priority: 1,
action: {
type: 'modifyHeaders',
requestHeaders: [
{
header: 'User-Agent',
operation: 'set',
value: CHZZK_USER_AGENT
}
]
},
condition: {
regexFilter: '^https://chzzk\\.naver\\.com/.*',
resourceTypes: ['main_frame', 'sub_frame', 'xmlhttprequest', 'media']
}
}
]
: []
})
}

const syncChzzkUserAgentRule = (): void => {
getOption()
.then(({ uaChange }) => setChzzkUserAgentRule(uaChange))
.catch(console.error)
}

export default defineBackground(() => {
// Download message listener
syncChzzkUserAgentRule()
chrome.runtime.onInstalled.addListener(syncChzzkUserAgentRule)
chrome.runtime.onStartup.addListener(syncChzzkUserAgentRule)

chrome.storage.onChanged.addListener((changes, areaName) => {
if (areaName !== 'local' || changes.option == null) {
return
}

const nextOption = changes.option.newValue as Record<string, unknown> | undefined
const prevOption = changes.option.oldValue as Record<string, unknown> | undefined

const nextUaChange = typeof nextOption?.uaChange === 'boolean' ? nextOption.uaChange : DEFAULT_OPTIONS.uaChange
const prevUaChange = typeof prevOption?.uaChange === 'boolean' ? prevOption.uaChange : DEFAULT_OPTIONS.uaChange

if (nextUaChange === prevUaChange) {
return
}

setChzzkUserAgentRule(nextUaChange)
.catch(console.error)
})

// Download message listener
chrome.runtime.onMessage.addListener((request: MessageType) => {
if (request.type === 'download') {
const msg = request as DownloadMessage
Expand Down
8 changes: 8 additions & 0 deletions src/entrypoints/popup/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,14 @@ export default function App (): React.ReactNode {
<Option.CheckButton optionID='pip' />
</Option>

<Option>
<Option.Header
title='UA 변경'
desc='https://chzzk.naver.com/ 접속 시 브라우저 User-Agent를 Opera 기반 값으로 변경합니다.'
/>
<Option.CheckButton optionID='uaChange' />
</Option>

<Collapsable
title='고급 옵션'
desc='확장 프로그램의 작동 방식에 큰 변화를 주는 옵션들입니다.
Expand Down
4 changes: 3 additions & 1 deletion src/types/options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ interface BooleanOptions {
preferHQ?: boolean
autoPIP?: boolean
favorites?: boolean
uaChange?: boolean
}

export interface OtherOptions {
Expand All @@ -29,7 +30,8 @@ export const DEFAULT_OPTIONS: Required<Option> = {
videoBitsPerSecond: 4000000,
preferHQ: false,
autoPIP: true,
favorites: false
favorites: false,
uaChange: true
}

export interface KeyBindings {
Expand Down
3 changes: 2 additions & 1 deletion wxt.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ export default defineConfig({
action: {
default_title: 'Cheese-PIP'
},
permissions: ['storage', 'downloads'],
permissions: ['storage', 'downloads', 'declarativeNetRequest'],
host_permissions: ['https://chzzk.naver.com/*'],
web_accessible_resources: [
{
resources: ['src/*', 'pages/*', 'chunks/*', 'assets/*', 'ffmpeg/*', 'monkeypatch/*', '*.html'],
Expand Down
Loading