Make mv3 compatible

This commit is contained in:
bytedream 2023-11-17 14:48:04 +01:00
parent fffe23638c
commit fe14edc0ef
10 changed files with 34 additions and 42 deletions

16
package-lock.json generated
View File

@ -13,7 +13,6 @@
"@sveltejs/vite-plugin-svelte": "^2.1.1", "@sveltejs/vite-plugin-svelte": "^2.1.1",
"@tsconfig/svelte": "^4.0.1", "@tsconfig/svelte": "^4.0.1",
"@types/chrome": "^0.0.228", "@types/chrome": "^0.0.228",
"@types/webextension-polyfill": "^0.10.0",
"@typescript-eslint/eslint-plugin": "^6.10.0", "@typescript-eslint/eslint-plugin": "^6.10.0",
"@typescript-eslint/parser": "^6.10.0", "@typescript-eslint/parser": "^6.10.0",
"eslint": "^8.53.0", "eslint": "^8.53.0",
@ -29,8 +28,7 @@
"tslib": "^2.5.0", "tslib": "^2.5.0",
"typescript": "^5.0.4", "typescript": "^5.0.4",
"vite": "~4.3.3", "vite": "~4.3.3",
"web-ext": "^7.6.2", "web-ext": "^7.6.2"
"webextension-polyfill": "^0.10.0"
} }
}, },
"node_modules/@aashutoshrathi/word-wrap": { "node_modules/@aashutoshrathi/word-wrap": {
@ -1096,12 +1094,6 @@
"integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==", "integrity": "sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==",
"dev": true "dev": true
}, },
"node_modules/@types/webextension-polyfill": {
"version": "0.10.6",
"resolved": "https://registry.npmjs.org/@types/webextension-polyfill/-/webextension-polyfill-0.10.6.tgz",
"integrity": "sha512-tHMENOd86LDISoxw/8C3KFazU1T6X5+eMhI3AS0KU9pYVLYb4kuQ2tIdrpE9aBqd2y8Ix4cVwR/Jwm2fzABTow==",
"dev": true
},
"node_modules/@types/yauzl": { "node_modules/@types/yauzl": {
"version": "2.10.0", "version": "2.10.0",
"resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz",
@ -7295,12 +7287,6 @@
"node": ">= 8" "node": ">= 8"
} }
}, },
"node_modules/webextension-polyfill": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz",
"integrity": "sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==",
"dev": true
},
"node_modules/webidl-conversions": { "node_modules/webidl-conversions": {
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",

View File

@ -29,7 +29,6 @@
"@sveltejs/vite-plugin-svelte": "^2.1.1", "@sveltejs/vite-plugin-svelte": "^2.1.1",
"@tsconfig/svelte": "^4.0.1", "@tsconfig/svelte": "^4.0.1",
"@types/chrome": "^0.0.228", "@types/chrome": "^0.0.228",
"@types/webextension-polyfill": "^0.10.0",
"@typescript-eslint/eslint-plugin": "^6.10.0", "@typescript-eslint/eslint-plugin": "^6.10.0",
"@typescript-eslint/parser": "^6.10.0", "@typescript-eslint/parser": "^6.10.0",
"eslint": "^8.53.0", "eslint": "^8.53.0",
@ -45,8 +44,7 @@
"tslib": "^2.5.0", "tslib": "^2.5.0",
"typescript": "^5.0.4", "typescript": "^5.0.4",
"vite": "~4.3.3", "vite": "~4.3.3",
"web-ext": "^7.6.2", "web-ext": "^7.6.2"
"webextension-polyfill": "^0.10.0"
}, },
"type": "module" "type": "module"
} }

View File

@ -1,13 +1,9 @@
import './shared';
import type { Match } from '~/lib/match'; import type { Match } from '~/lib/match';
import { storageDelete, storageGet, storageSet } from '~/lib/settings'; import { storageDelete, storageGet, storageSet } from '~/lib/settings';
import { getMatch } from '~/lib/match'; import { getMatch } from '~/lib/match';
chrome.runtime.onMessage.addListener(async (message) => {
if (message.action == 'ff2mpv') {
await chrome.runtime.sendNativeMessage('ff2mpv', { url: message.url });
}
});
chrome.webRequest.onBeforeRedirect.addListener( chrome.webRequest.onBeforeRedirect.addListener(
async (details) => { async (details) => {
// check if redirects origins from a previous redirect // check if redirects origins from a previous redirect

View File

@ -0,0 +1 @@
import './shared';

View File

@ -0,0 +1,5 @@
chrome.runtime.onMessage.addListener(async (message) => {
if (message.action == 'ff2mpv') {
await chrome.runtime.sendNativeMessage('ff2mpv', { url: message.url });
}
});

View File

@ -1,7 +1,6 @@
import type { Match } from '~/lib/match'; import type { Match } from '~/lib/match';
import { getMatch } from '~/lib/match'; import { getMatch } from '~/lib/match';
import { Other, Redirect } from '~/lib/settings'; import { Other, Redirect } from '~/lib/settings';
import browser from 'webextension-polyfill';
async function main() { async function main() {
let match: Match; let match: Match;
@ -25,7 +24,7 @@ async function main() {
// send the url to the ff2mpv (https://github.com/woodruffw/ff2mpv) application // send the url to the ff2mpv (https://github.com/woodruffw/ff2mpv) application
if (await Other.getFf2mpv()) { if (await Other.getFf2mpv()) {
await browser.runtime.sendMessage({ action: 'ff2mpv', url: url }); await chrome.runtime.sendMessage({ action: 'ff2mpv', url: url });
} }
if (match.replace && !url.includes('.m3u8')) { if (match.replace && !url.includes('.m3u8')) {
@ -39,7 +38,7 @@ async function main() {
document.body.append(player); document.body.append(player);
} else { } else {
window.location.assign( window.location.assign(
browser.runtime.getURL( chrome.runtime.getURL(
`src/entries/player/player.html?id=${match.id}&url=${encodeURIComponent(url)}&domain=${ `src/entries/player/player.html?id=${match.id}&url=${encodeURIComponent(url)}&domain=${
window.location.hostname window.location.hostname
}` }`

View File

@ -1,5 +1,5 @@
import { unpack } from '~/lib/utils'; import { unpack } from './utils';
import { Hosters } from '~/lib/settings'; import { Hosters } from './settings';
export enum Reliability { export enum Reliability {
HIGH, HIGH,

View File

@ -1,6 +1,5 @@
import browser from 'webextension-polyfill'; import type { Match } from './match';
import type { Match } from '~/lib/match'; import { matches } from './match';
import { matches } from '~/lib/match';
export const Hosters = { export const Hosters = {
getDisabled: async () => { getDisabled: async () => {
@ -56,7 +55,7 @@ export const Other = {
}; };
export async function storageGet<T>(key: string, defaultValue?: T): Promise<T | undefined> { export async function storageGet<T>(key: string, defaultValue?: T): Promise<T | undefined> {
const entry = await browser.storage.local.get(key); const entry = await chrome.storage.local.get(key);
const value = entry[key]; const value = entry[key];
return value === undefined ? defaultValue : value; return value === undefined ? defaultValue : value;
} }
@ -65,9 +64,9 @@ export async function storageSet<T>(key: string, value: T) {
const obj = { const obj = {
[key]: value [key]: value
}; };
await browser.storage.local.set(obj); await chrome.storage.local.set(obj);
} }
export async function storageDelete(key: string) { export async function storageDelete(key: string) {
await browser.storage.local.remove(key); await chrome.storage.local.remove(key);
} }

View File

@ -1,4 +1,5 @@
import pkg from '../package.json'; import pkg from '../package.json';
import { matches } from './lib/match';
const sharedManifest: Partial<chrome.runtime.ManifestBase> = { const sharedManifest: Partial<chrome.runtime.ManifestBase> = {
browser_specific_settings: { browser_specific_settings: {
@ -9,7 +10,7 @@ const sharedManifest: Partial<chrome.runtime.ManifestBase> = {
content_scripts: [ content_scripts: [
{ {
all_frames: true, all_frames: true,
matches: ['<all_urls>'], matches: Object.values(matches).flatMap((m) => m.domains.map((d) => `*://${d}/*`)),
js: ['src/entries/contentScript/main.ts'], js: ['src/entries/contentScript/main.ts'],
run_at: 'document_end' run_at: 'document_end'
} }
@ -21,7 +22,7 @@ const sharedManifest: Partial<chrome.runtime.ManifestBase> = {
96: 'icons/stream-bypass@96px.png', 96: 'icons/stream-bypass@96px.png',
128: 'icons/stream-bypass@128px.png' 128: 'icons/stream-bypass@128px.png'
}, },
permissions: ['storage', 'webRequest', 'nativeMessaging', '<all_urls>'] permissions: ['storage', 'nativeMessaging']
}; };
const browserAction = { const browserAction = {
@ -35,18 +36,19 @@ const browserAction = {
const ManifestV2 = { const ManifestV2 = {
...sharedManifest, ...sharedManifest,
background: { background: {
scripts: ['src/entries/background/main.ts'], scripts: ['src/entries/background/mv2.ts'],
persistent: true persistent: true
}, },
content_scripts: [{ ...sharedManifest.content_scripts[0], matches: ['<all_urls>'] }],
browser_action: browserAction, browser_action: browserAction,
permissions: [...sharedManifest.permissions] permissions: [...sharedManifest.permissions, 'webRequest', '<all_urls>']
}; };
const ManifestV3 = { const ManifestV3 = {
...sharedManifest, ...sharedManifest,
action: browserAction, action: browserAction,
background: { background: {
service_worker: 'src/entries/background/main.ts' service_worker: 'src/entries/background/mv3.ts'
} }
}; };
@ -71,6 +73,9 @@ export function getManifest(
if (manifestVersion === 3) { if (manifestVersion === 3) {
return { return {
...manifest, ...manifest,
// just like all the adblockers which are unable to fully work under MV3, we need access to every website
// the user enters in order to work correctly, which is forbidden when using MV3
name: `${manifest.name} Lite`,
...ManifestV3, ...ManifestV3,
manifest_version: manifestVersion manifest_version: manifestVersion
}; };

View File

@ -3,6 +3,7 @@ import { svelte } from '@sveltejs/vite-plugin-svelte';
import webExtension from '@samrum/vite-plugin-web-extension'; import webExtension from '@samrum/vite-plugin-web-extension';
import path from 'path'; import path from 'path';
import { getManifest } from './src/manifest'; import { getManifest } from './src/manifest';
import { matches } from './src/lib/match';
// https://vitejs.dev/config/ // https://vitejs.dev/config/
export default defineConfig(({ mode }) => { export default defineConfig(({ mode }) => {
@ -18,8 +19,10 @@ export default defineConfig(({ mode }) => {
{ {
fileName: 'src/entries/player/player.html', fileName: 'src/entries/player/player.html',
webAccessible: { webAccessible: {
matches: ['<all_urls>'], matches:
excludeEntryFile: true Number(env.MANIFEST_VERSION) === 3
? Object.values(matches).flatMap((m) => m.domains.map((d) => `*://${d}/*`))
: ['<all_urls>']
} }
} }
] ]