diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 916dbc6a66..d4d8776804 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,7 +12,8 @@ jobs: steps: # Initialization - - uses: actions/checkout@v4 + - name: Checkout release branch w/submodules + uses: actions/checkout@v5 with: submodules: recursive - uses: actions/setup-node@v4 @@ -34,12 +35,27 @@ jobs: path: ../builds/SourceCodeUseThisOne.zip repo-token: ${{ secrets.GITHUB_TOKEN }} + - name: Checkout source maps branch + uses: actions/checkout@v5 + with: + path: source-maps + ref: source-maps + - name: Set up committer info + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - run: npm ci # Create Firefox artifacts - name: Create Firefox artifacts - run: npm run build:firefox + run: npm run build:firefox -- --env ghpSourceMaps - run: mkdir ./builds + - name: Move Firefox source maps to source map repo + run: | + VERSION=`jq -r '.version' ./dist/manifest.json` + mkdir -p "./source-maps/firefox/$VERSION/" + mv -v ./dist/**/*.js.map "./source-maps/firefox/$VERSION/" + cp -v ./dist/**/*.js.LICENSE.txt "./source-maps/firefox/$VERSION/" - name: Zip Artifacts run: cd ./dist ; zip -r ../builds/FirefoxExtension.zip * - name: Upload FirefoxExtension to release @@ -52,7 +68,13 @@ jobs: # Create Chrome artifacts - name: Create Chrome artifacts - run: npm run build:chrome + run: npm run build:chrome -- --env ghpSourceMaps + - name: Move Chrome source maps to source map repo + run: | + VERSION=`jq -r '.version' ./dist/manifest.json` + mkdir -p "./source-maps/chrome/$VERSION/" + mv -v ./dist/**/*.js.map "./source-maps/chrome/$VERSION/" + cp -v ./dist/**/*.js.LICENSE.txt "./source-maps/chrome/$VERSION/" - name: Zip Artifacts run: cd ./dist ; zip -r ../builds/ChromeExtension.zip * - name: Upload ChromeExtension to release @@ -67,7 +89,13 @@ jobs: - name: Clear dist for Edge run: rm -rf ./dist - name: Create Edge artifacts - run: npm run build:edge + run: npm run build:edge -- --env ghpSourceMaps + - name: Move Edge source maps to source map repo + run: | + VERSION=`jq -r '.version' ./dist/manifest.json` + mkdir -p "./source-maps/edge/$VERSION/" + mv -v ./dist/**/*.js.map "./source-maps/edge/$VERSION/" + cp -v ./dist/**/*.js.LICENSE.txt "./source-maps/edge/$VERSION/" - name: Zip Artifacts run: cd ./dist ; zip -r ../builds/EdgeExtension.zip * - name: Upload EdgeExtension to release @@ -80,7 +108,13 @@ jobs: # Create Safari artifacts - name: Create Safari artifacts - run: npm run build:safari + run: npm run build:safari -- --env ghpSourceMaps + - name: Move Safari source maps to source map repo + run: | + VERSION=`jq -r '.version' ./dist/manifest.json` + mkdir -p "./source-maps/safari/$VERSION/" + mv -v ./dist/**/*.js.map "./source-maps/safari/$VERSION/" + cp -v ./dist/**/*.js.LICENSE.txt "./source-maps/safari/$VERSION/" - name: Zip Artifacts run: cd ./dist ; zip -r ../builds/SafariExtension.zip * - name: Upload SafariExtension to release @@ -93,7 +127,13 @@ jobs: # Create Beta artifacts (Builds with the name changed to beta) - name: Create Chrome Beta artifacts - run: npm run build:chrome -- --env stream=beta + run: npm run build:chrome -- --env stream=beta --env ghpSourceMaps + - name: Move Chrome Beta source maps to source map repo + run: | + VERSION=`jq -r '.version' ./dist/manifest.json` + mkdir -p "./source-maps/chrome-beta/$VERSION/" + mv -v ./dist/**/*.js.map "./source-maps/chrome-beta/$VERSION/" + cp -v ./dist/**/*.js.LICENSE.txt "./source-maps/chrome-beta/$VERSION/" - name: Zip Artifacts run: cd ./dist ; zip -r ../builds/ChromeExtensionBeta.zip * - name: Upload ChromeExtensionBeta to release @@ -106,11 +146,17 @@ jobs: # Firefox Beta - name: Create Firefox Beta artifacts - run: npm run build:firefox -- --env stream=beta + run: npm run build:firefox -- --env stream=beta --env autoupdate --env ghpSourceMaps - uses: actions/upload-artifact@v4 with: name: FirefoxExtensionBeta path: dist + - name: Move Firefox Beta source maps to source map repo + run: | + VERSION=`jq -r '.version' ./dist/manifest.json` + mkdir -p "./source-maps/firefox-beta/$VERSION/" + mv -v ./dist/**/*.js.map "./source-maps/firefox-beta/$VERSION/" + cp -v ./dist/**/*.js.LICENSE.txt "./source-maps/firefox-beta/$VERSION/" - name: Zip Artifacts run: cd ./dist ; zip -r ../builds/FirefoxExtensionBeta.zip * @@ -120,10 +166,8 @@ jobs: env: WEB_EXT_API_KEY: ${{ secrets.WEB_EXT_API_KEY }} WEB_EXT_API_SECRET: ${{ secrets.WEB_EXT_API_SECRET }} - - name: Install rename - run: sudo apt-get install rename - name: Rename signed file - run: cd ./web-ext-artifacts ; rename 's/.*/FirefoxSignedInstaller.xpi/' * + run: mv ./web-ext-artifacts/* ./web-ext-artifacts/FirefoxSignedInstaller.xpi - uses: actions/upload-artifact@v4 with: name: FirefoxExtensionSigned.xpi @@ -137,3 +181,80 @@ jobs: path: ./web-ext-artifacts/FirefoxSignedInstaller.xpi repo-token: ${{ secrets.GITHUB_TOKEN }} + - name: Commit & push new source maps + if: always() + run: | + VERSION=`jq -r '.version' ./dist/manifest.json` + cd ./source-maps + git add . + git commit -m "Publish source maps for version $VERSION" + git push + + - name: Prepare new github pages deployment + shell: python + run: | + from pathlib import Path + import json + import shutil + import os + + # config stuff + installer_name = "FirefoxSignedInstaller.xpi" + owner, repo_name = os.environ["GITHUB_REPOSITORY"].split("/") + owner = owner.lower() + + # create the github paged dir + ghp_dir = Path("./github-pages") + ghp_dir.mkdir(parents=True, exist_ok=True) + + # move in the installer + Path("./web-ext-artifacts", installer_name).rename(ghp_dir / installer_name) + + # read manifest.json and extract parameters + with open("./dist/manifest.json") as f: + manifest = json.load(f) + current_version = manifest["version"] + ext_id = manifest["browser_specific_settings"]["gecko"]["id"] + + # generate updates file + updates = { + "addons": { + ext_id: { + "updates": [ + { + "version": current_version, + # param doesn't actually matter, it's just a cachebuster + "update_link": f"https://{owner}.github.io/{repo_name}/{installer_name}?v={current_version}", + }, + ], + }, + }, + } + (ghp_dir / "updates.json").write_text(json.dumps(updates)) + + # copy in source maps + def only_sourcemaps(cur, ls): + if '/' in cur: + return [] + return set(ls) - {"chrome", "chrome-beta", "edge", "firefox", "firefox-beta", "safari"} + shutil.copytree("source-maps", ghp_dir, ignore=only_sourcemaps, dirs_exist_ok=True) + + - name: Upload new github pages deployment + uses: actions/upload-pages-artifact@v3 + with: + path: ./github-pages + + deploy-ghp: + name: Deploy to github pages + needs: build + permissions: + id-token: write + pages: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Deploy + id: deployment + uses: actions/deploy-pages@v4 diff --git a/manifest/manifest.json b/manifest/manifest.json index 5f01711b00..b840fdc1a6 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_fullName__", "short_name": "SponsorBlock", - "version": "6.0", + "version": "6.0.1", "default_locale": "en", "description": "__MSG_Description__", "homepage_url": "https://sponsor.ajay.app", diff --git a/public/_locales b/public/_locales index f7d565226e..fcee4620b3 160000 --- a/public/_locales +++ b/public/_locales @@ -1 +1 @@ -Subproject commit f7d565226ebfd457f866311a714ad8fdace8e37e +Subproject commit fcee4620b37c91603653df74891cb58fd0381ab7 diff --git a/src/popup/SegmentListComponent.tsx b/src/popup/SegmentListComponent.tsx index 1d6aa396c9..d56b7baee5 100644 --- a/src/popup/SegmentListComponent.tsx +++ b/src/popup/SegmentListComponent.tsx @@ -32,6 +32,14 @@ interface SegmentWithNesting extends SponsorTime { innerChapters?: (SegmentWithNesting|SponsorTime)[]; } +function isSegment(segment) { + return segment.actionType !== ActionType.Chapter; +} + +function isChapter(segment) { + return segment.actionType === ActionType.Chapter; +} + export const SegmentListComponent = (props: SegmentListComponentProps) => { const [tab, setTab] = React.useState(SegmentListTab.Segments); const [isVip, setIsVip] = React.useState(Config.config?.isVip ?? false); @@ -46,17 +54,19 @@ export const SegmentListComponent = (props: SegmentListComponentProps) => { } }, []); - React.useEffect(() => { - setTab(SegmentListTab.Segments); - }, [props.videoID]); + const [hasSegments, hasChapters] = React.useMemo(() => { + const hasSegments = Boolean(props.segments.find(isSegment)) + const hasChapters = Boolean(props.segments.find(isChapter)) + return [hasSegments, hasChapters]; + }, [props.segments]); - const tabFilter = (segment: SponsorTime) => { - if (tab === SegmentListTab.Chapter) { - return segment.actionType === ActionType.Chapter; + React.useEffect(() => { + if (hasSegments){ + setTab(SegmentListTab.Segments); } else { - return segment.actionType !== ActionType.Chapter; + setTab(SegmentListTab.Chapter); } - }; + }, [props.videoID, hasSegments]); const segmentsWithNesting = React.useMemo(() => { const result: SegmentWithNesting[] = []; @@ -98,7 +108,7 @@ export const SegmentListComponent = (props: SegmentListComponentProps) => { return (
-
s.actionType === ActionType.Chapter) ? "" : "hidden"}> +
{ setTab(SegmentListTab.Segments); }}> @@ -125,7 +135,7 @@ export const SegmentListComponent = (props: SegmentListComponentProps) => { isVip={isVip} loopedChapter={props.loopedChapter} // UUID instead of boolean so it can be passed down to nested chapters - tabFilter={tabFilter} + tabFilter={tab === SegmentListTab.Chapter ? isChapter : isSegment} sendMessage={props.sendMessage} /> )) diff --git a/tsconfig-production.json b/tsconfig-production.json index c79b6f6144..6f9122e01c 100644 --- a/tsconfig-production.json +++ b/tsconfig-production.json @@ -5,7 +5,7 @@ "noImplicitAny": false, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, - "sourceMap": false, + "sourceMap": true, "outDir": "dist/js", "noEmitOnError": false, "typeRoots": [ "node_modules/@types" ], @@ -20,4 +20,4 @@ "include": [ "src/**/*" ] -} \ No newline at end of file +} diff --git a/webpack/webpack.common.js b/webpack/webpack.common.js index 3db98d1373..512bb7df7e 100644 --- a/webpack/webpack.common.js +++ b/webpack/webpack.common.js @@ -189,7 +189,8 @@ module.exports = env => { new BuildManifest({ browser: env.browser, pretty: env.mode === "production", - stream: env.stream + stream: env.stream, + autoupdate: env.autoupdate, }), new configDiffPlugin() ], @@ -200,4 +201,4 @@ module.exports = env => { } }; -}; \ No newline at end of file +}; diff --git a/webpack/webpack.manifest.js b/webpack/webpack.manifest.js index 1666c8a1dd..2b8664989c 100644 --- a/webpack/webpack.manifest.js +++ b/webpack/webpack.manifest.js @@ -23,10 +23,13 @@ const schema = { pretty: { type: 'boolean' }, - steam: { + stream: { type: 'string' + }, + autoupdate: { + type: 'boolean', } - } + } }; class BuildManifest { @@ -39,6 +42,7 @@ class BuildManifest { apply() { const distFolder = path.resolve(__dirname, "../dist/"); const distManifestFile = path.resolve(distFolder, "manifest.json"); + const [owner, repo_name] = (process.env.GITHUB_REPOSITORY ?? "ajayyy/SponsorBlock").split("/"); // Add missing manifest elements if (this.options.browser.toLowerCase() === "firefox") { @@ -62,6 +66,10 @@ class BuildManifest { } } + if (this.options.autoupdate === true && this.options.browser.toLowerCase() === "firefox") { + manifest.browser_specific_settings.gecko.update_url = `https://${owner.toLowerCase()}.github.io/${repo_name}/updates.json`; + } + let result = JSON.stringify(manifest); if (this.options.pretty) result = JSON.stringify(manifest, null, 2); @@ -86,4 +94,4 @@ function mergeObjects(object1, object2) { } } -module.exports = BuildManifest; \ No newline at end of file +module.exports = BuildManifest; diff --git a/webpack/webpack.prod.js b/webpack/webpack.prod.js index 03e1708e3a..eb66b24676 100644 --- a/webpack/webpack.prod.js +++ b/webpack/webpack.prod.js @@ -1,12 +1,40 @@ /* eslint-disable @typescript-eslint/no-var-requires */ +const { SourceMapDevToolPlugin } = require('webpack'); const { merge } = require('webpack-merge'); const common = require('./webpack.common.js'); -module.exports = env => { +async function createGHPSourceMapURL(env) { + const manifest = require("../manifest/manifest.json"); + const version = manifest.version; + const [owner, repo_name] = (process.env.GITHUB_REPOSITORY ?? "ajayyy/SponsorBlock").split("/"); + const ghpUrl = `https://${owner.toLowerCase()}.github.io/${repo_name}/${env.browser}${env.stream === "beta" ? "-beta" : ""}/${version}/`; + // make a request to the url and check if we got redirected + // firefox doesn't seem to like getting redirected on a source map request + try { + const resp = await fetch(ghpUrl); + return resp.url; + } catch { + return ghpUrl; + } +} + +module.exports = async env => { let mode = "production"; env.mode = mode; return merge(common(env), { - mode + mode, + ...(env.ghpSourceMaps + ? { + devtool: false, + plugins: [new SourceMapDevToolPlugin({ + publicPath: await createGHPSourceMapURL(env), + filename: '[file].map[query]', + })], + } + : { + devtool: "source-map", + } + ), }); -}; \ No newline at end of file +};