diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cccd90a7479f9..5d34902f607ac 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,9 +20,7 @@ jobs: - win-x64 - win-arm64 - osx-x64 - # `osx-arm64` disabled due to "macOS gatekeeper" - # See details in https://github.com/FreeTubeApp/FreeTube/pull/2113 - # - osx-arm64 + - osx-arm64 include: - runtime: linux-x64 os: ubuntu-latest @@ -36,8 +34,8 @@ jobs: - runtime: osx-x64 os: macOS-latest -# - runtime: osx-arm64 -# os: macOS-latest + - runtime: osx-arm64 + os: macOS-latest - runtime: win-x64 os: windows-latest @@ -102,6 +100,19 @@ jobs: if: contains(matrix.runtime, 'arm64') run: yarn run build:arm64 + - name: Convert X64 AppImage to static runtime + if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64') + run: | + sudo apt install desktop-file-utils + cd build + appimage="FreeTube-${{ steps.versionNumber.outputs.result }}.AppImage" + wget "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage" -O ./appimagetool.AppImage + chmod +x ./"$appimage" ./appimagetool.AppImage + ./"$appimage" --appimage-extract && rm -f ./"$appimage" + ./appimagetool.AppImage --comp zstd --mksquashfs-opt -Xcompression-level --mksquashfs-opt 20 \ + -n ./squashfs-root ./"$appimage" + rm -rf ./squashfs-root ./appimagetool.AppImage + - name: Upload Linux .zip x64 Artifact uses: actions/upload-artifact@v4 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64') @@ -300,12 +311,12 @@ jobs: name: freetube-${{ steps.versionNumber.outputs.result }}-mac-x64.dmg path: build/freetube-${{ steps.versionNumber.outputs.result }}.dmg -# - name: Upload Mac arm64 .dmg Artifact -# uses: actions/upload-artifact@v4 -# if: startsWith(matrix.os, 'macos') && startsWith(matrix.runtime, 'osx-arm64') -# with: -# name: freetube-${{ steps.versionNumber.outputs.result }}-mac-arm64.dmg -# path: build/freetube-${{ steps.versionNumber.outputs.result }}-arm64.dmg + - name: Upload Mac arm64 .dmg Artifact + uses: actions/upload-artifact@v4 + if: startsWith(matrix.os, 'macos') && startsWith(matrix.runtime, 'osx-arm64') + with: + name: freetube-${{ steps.versionNumber.outputs.result }}-mac-arm64.dmg + path: build/freetube-${{ steps.versionNumber.outputs.result }}-arm64.dmg - name: Upload Mac x64 .zip Artifact uses: actions/upload-artifact@v4 @@ -321,9 +332,16 @@ jobs: name: freetube-${{ steps.versionNumber.outputs.result }}-mac-x64.7z path: build/freetube-${{ steps.versionNumber.outputs.result }}-mac.7z -# - name: Upload Mac arm64 .zip Artifact -# uses: actions/upload-artifact@v4 -# if: startsWith(matrix.os, 'macos') && startsWith(matrix.runtime, 'osx-arm64') -# with: -# name: freetube-${{ steps.versionNumber.outputs.result }}-mac-arm64.zip -# path: build/freetube-${{ steps.versionNumber.outputs.result }}-arm64-mac.zip + - name: Upload Mac arm64 .zip Artifact + uses: actions/upload-artifact@v4 + if: startsWith(matrix.os, 'macos') && startsWith(matrix.runtime, 'osx-arm64') + with: + name: freetube-${{ steps.versionNumber.outputs.result }}-mac-arm64.zip + path: build/freetube-${{ steps.versionNumber.outputs.result }}-arm64-mac.zip + + - name: Upload Mac arm64 .7z Artifact + uses: actions/upload-artifact@v4 + if: startsWith(matrix.os, 'macos') && startsWith(matrix.runtime, 'osx-arm64') + with: + name: freetube-${{ steps.versionNumber.outputs.result }}-mac-arm64.7z + path: build/freetube-${{ steps.versionNumber.outputs.result }}-arm64-mac.7z diff --git a/.github/workflows/flatpak.yml b/.github/workflows/flatpak.yml index 94ece70dda5f5..217f4c926cc43 100644 --- a/.github/workflows/flatpak.yml +++ b/.github/workflows/flatpak.yml @@ -77,22 +77,22 @@ jobs: date +"%Y-%m-%d" >> $GITHUB_ENV echo 'EOF' >> $GITHUB_ENV - name: Update x64 File Location in yml File - uses: mikefarah/yq@v4.44.5 + uses: mikefarah/yq@v4.44.6 with: # The Command which should be run cmd: yq -i '.modules[0].sources[0].url = "https://github.com/FreeTubeApp/FreeTube/releases/download/v${{ steps.sub.outputs.result }}-beta/freetube-${{ steps.sub.outputs.result }}-linux-portable-x64.zip"' io.freetubeapp.FreeTube.yml - name: Update x64 Hash in yml File - uses: mikefarah/yq@v4.44.5 + uses: mikefarah/yq@v4.44.6 with: # The Command which should be run cmd: yq -i '.modules[0].sources[0].sha256 = "${{ env.HASH_X64 }}"' io.freetubeapp.FreeTube.yml - name: Update ARM File Location in yml File - uses: mikefarah/yq@v4.44.5 + uses: mikefarah/yq@v4.44.6 with: # The Command which should be run cmd: yq -i '.modules[0].sources[1].url = "https://github.com/FreeTubeApp/FreeTube/releases/download/v${{ steps.sub.outputs.result }}-beta/freetube-${{ steps.sub.outputs.result }}-linux-portable-arm64.zip"' io.freetubeapp.FreeTube.yml - name: Update ARM Hash in yml File - uses: mikefarah/yq@v4.44.5 + uses: mikefarah/yq@v4.44.6 with: # The Command which should be run cmd: yq -i '.modules[0].sources[1].sha256 = "${{ env.HASH_ARM64 }}"' io.freetubeapp.FreeTube.yml diff --git a/.github/workflows/no-response.yml b/.github/workflows/no-response.yml index 1e1e82bb42689..b430c13ed588d 100644 --- a/.github/workflows/no-response.yml +++ b/.github/workflows/no-response.yml @@ -20,5 +20,5 @@ jobs: This issue has been automatically closed because there has been no response to our request for more information from the original author. With only the information that is currently in the issue, we don't have enough information to take action. Please reach out if you have or find the answers we need so that we can investigate further. - daysUntilClose: 14 + daysUntilClose: 7 responseRequiredLabel: "U: Waiting for Response from Author" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 572fcab1a55df..7438d0c110de5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,9 +20,7 @@ jobs: - win-x64 - win-arm64 - osx-x64 - # `osx-arm64` disabled due to "macOS gatekeeper" - # See details in https://github.com/FreeTubeApp/FreeTube/pull/2113 - # - osx-arm64 + - osx-arm64 include: - runtime: linux-x64 os: ubuntu-latest @@ -36,8 +34,8 @@ jobs: - runtime: osx-x64 os: macOS-latest -# - runtime: osx-arm64 -# os: macOS-latest + - runtime: osx-arm64 + os: macOS-latest - runtime: win-x64 os: windows-latest @@ -73,6 +71,19 @@ jobs: if: contains(matrix.runtime, 'arm64') run: yarn run build:arm64 + - name: Convert X64 AppImage to static runtime + if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64') + run: | + sudo apt install desktop-file-utils + cd build + appimage="FreeTube-${{ steps.versionNumber.outputs.result }}.AppImage" + wget "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage" -O ./appimagetool.AppImage + chmod +x ./"$appimage" ./appimagetool.AppImage + ./"$appimage" --appimage-extract && rm -f ./"$appimage" + ./appimagetool.AppImage --comp zstd --mksquashfs-opt -Xcompression-level --mksquashfs-opt 20 \ + -n ./squashfs-root ./"$appimage" + rm -rf ./squashfs-root ./appimagetool.AppImage + - name: Upload AppImage x64 Release uses: actions/upload-release-asset@v1 if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64') @@ -306,16 +317,16 @@ jobs: asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}.dmg asset_content_type: application/x-apple-diskimage -# - name: Upload Mac arm64 .dmg Release -# uses: actions/upload-release-asset@v1 -# if: startsWith(matrix.os, 'macos') && startsWith(matrix.runtime, 'osx-arm64') -# env: -# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -# with: -# upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} -# asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-mac-arm64.dmg -# asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-arm64.dmg -# asset_content_type: application/x-apple-diskimage + - name: Upload Mac arm64 .dmg Release + uses: actions/upload-release-asset@v1 + if: startsWith(matrix.os, 'macos') && startsWith(matrix.runtime, 'osx-arm64') + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-mac-arm64.dmg + asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-arm64.dmg + asset_content_type: application/x-apple-diskimage - name: Upload Mac x64 .zip Release uses: actions/upload-release-asset@v1 @@ -339,13 +350,24 @@ jobs: asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-mac.7z asset_content_type: application/x-7z-compressed -# - name: Upload Mac arm64 .zip Release -# uses: actions/upload-release-asset@v1 -# if: startsWith(matrix.os, 'macos') && startsWith(matrix.runtime, 'osx-arm64') -# env: -# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -# with: -# upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} -# asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-mac-arm64.zip -# asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-arm64-mac.zip -# asset_content_type: application/x-apple-diskimage + - name: Upload Mac arm64 .zip Release + uses: actions/upload-release-asset@v1 + if: startsWith(matrix.os, 'macos') && startsWith(matrix.runtime, 'osx-arm64') + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-mac-arm64.zip + asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-arm64-mac.zip + asset_content_type: application/x-apple-diskimage + + - name: Upload Mac arm64 .7z Release + uses: actions/upload-release-asset@v1 + if: startsWith(matrix.os, 'macos') && startsWith(matrix.runtime, 'osx-arm64') + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label} + asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-mac-arm64.7z + asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-arm64-mac.7z + asset_content_type: application/x-7z-compressed diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 6945419318d9a..354408edee5ef 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -14,14 +14,14 @@ jobs: - uses: actions/stale@v9 with: stale-issue-message: 'This issue is stale because it has been open 28 days with no activity. Remove stale label or comment or this will be closed in 7 days.' - stale-pr-message: 'This PR is stale because it has been open 28 days with no activity. Remove stale label or comment or this will be closed in 14 days.' + stale-pr-message: 'This PR is stale because it has been open 14 days with no activity. Remove stale label or comment or this will be closed in 14 days.' close-issue-message: 'This issue was closed because it has been stalled for 7 days with no activity.' close-pr-message: 'This PR was closed because it has been stalled for 14 days with no activity.' days-before-issue-stale: 28 - days-before-pr-stale: 28 + days-before-pr-stale: 14 days-before-issue-close: 7 days-before-pr-close: 14 stale-issue-label: 'U: stale' stale-pr-label: 'PR: stale' exempt-pr-labels: 'PR: WIP' - exempt-issue-labels: 'enhancement' + exempt-issue-labels: 'enhancement, U: reproduced' diff --git a/_icons/iconGruvboxDarkSmall.svg b/_icons/iconGruvboxDarkSmall.svg index e0223807047ce..e6dd6ad1595cf 100644 --- a/_icons/iconGruvboxDarkSmall.svg +++ b/_icons/iconGruvboxDarkSmall.svg @@ -1,4 +1 @@ - - - - \ No newline at end of file + \ No newline at end of file diff --git a/_icons/iconGruvboxLightSmall.svg b/_icons/iconGruvboxLightSmall.svg index 8750e7bb31c0e..a08e5c34f9830 100644 --- a/_icons/iconGruvboxLightSmall.svg +++ b/_icons/iconGruvboxLightSmall.svg @@ -1,4 +1 @@ - - - - \ No newline at end of file + \ No newline at end of file diff --git a/_icons/textGruvboxDarkSmall.svg b/_icons/textGruvboxDarkSmall.svg index 00ece3081910a..00e3080e7268f 100644 --- a/_icons/textGruvboxDarkSmall.svg +++ b/_icons/textGruvboxDarkSmall.svg @@ -1,4 +1 @@ - - - - \ No newline at end of file + \ No newline at end of file diff --git a/_icons/textGruvboxLightSmall.svg b/_icons/textGruvboxLightSmall.svg index 266390e3ad010..434c116ddd900 100644 --- a/_icons/textGruvboxLightSmall.svg +++ b/_icons/textGruvboxLightSmall.svg @@ -1,4 +1 @@ - - - - \ No newline at end of file + \ No newline at end of file diff --git a/package.json b/package.json index 0f56574e21736..647fdcf34f311 100644 --- a/package.json +++ b/package.json @@ -67,14 +67,14 @@ "path-browserify": "^1.0.1", "portal-vue": "^2.1.7", "process": "^0.11.10", - "shaka-player": "^4.12.3", + "shaka-player": "^4.12.4", "swiper": "^11.1.15", "vue": "^2.7.16", "vue-i18n": "^8.28.2", "vue-observe-visibility": "^1.0.0", "vue-router": "^3.6.5", "vuex": "^3.6.2", - "youtubei.js": "^11.0.1" + "youtubei.js": "^12.0.0" }, "devDependencies": { "@babel/core": "^7.26.0", @@ -82,7 +82,7 @@ "@babel/preset-env": "^7.26.0", "@double-great/stylelint-a11y": "^3.0.2", "@eslint/js": "^9.16.0", - "@intlify/eslint-plugin-vue-i18n": "^3.1.0", + "@intlify/eslint-plugin-vue-i18n": "^3.2.0", "babel-loader": "^9.2.1", "copy-webpack-plugin": "^12.0.2", "css-loader": "^7.1.2", @@ -100,15 +100,15 @@ "html-webpack-plugin": "^5.6.3", "js-yaml": "^4.1.0", "json-minimizer-webpack-plugin": "^5.0.0", - "lefthook": "^1.8.5", + "lefthook": "^1.9.0", "mini-css-extract-plugin": "^2.9.2", "neostandard": "^0.11.9", "npm-run-all2": "^7.0.1", "postcss": "^8.4.49", "postcss-scss": "^4.0.9", "rimraf": "^6.0.1", - "sass": "^1.81.0", - "sass-loader": "^16.0.3", + "sass": "^1.82.0", + "sass-loader": "^16.0.4", "stylelint": "^16.11.0", "stylelint-config-sass-guidelines": "^12.1.0", "stylelint-config-standard": "^36.0.1", @@ -118,7 +118,7 @@ "vue-devtools": "^5.1.4", "vue-eslint-parser": "^9.4.3", "vue-loader": "^15.10.0", - "webpack": "^5.96.1", + "webpack": "^5.97.1", "webpack-cli": "^5.1.4", "webpack-dev-server": "^5.1.0", "yaml-eslint-parser": "^1.2.3" diff --git a/src/main/index.js b/src/main/index.js index eb3376c0776d2..4bd741a4accb9 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -254,13 +254,16 @@ function runApp() { app.on('second-instance', (_, commandLine, __) => { // Someone tried to run a second instance, we should focus our window - if (mainWindow && typeof commandLine !== 'undefined') { - if (mainWindow.isMinimized()) mainWindow.restore() - mainWindow.focus() - + if (typeof commandLine !== 'undefined') { const url = getLinkUrl(commandLine) - if (url) { - mainWindow.webContents.send(IpcChannels.OPEN_URL, url) + if (mainWindow && mainWindow.webContents) { + if (mainWindow.isMinimized()) mainWindow.restore() + mainWindow.focus() + + if (url) mainWindow.webContents.send(IpcChannels.OPEN_URL, url) + } else { + if (url) startupUrl = url + createWindow() } } }) @@ -829,10 +832,11 @@ function runApp() { }) } - ipcMain.once(IpcChannels.APP_READY, () => { + ipcMain.on(IpcChannels.APP_READY, () => { if (startupUrl) { mainWindow.webContents.send(IpcChannels.OPEN_URL, startupUrl, { isLaunchLink: true }) } + startupUrl = null }) function relaunch() { @@ -1442,6 +1446,7 @@ function runApp() { app.on('window-all-closed', () => { // Clean up resources (datastores' compaction + Electron cache and storage data clearing) cleanUpResources().finally(() => { + mainWindow = null if (process.platform !== 'darwin') { app.quit() } @@ -1511,6 +1516,7 @@ function runApp() { mainWindow.webContents.send(IpcChannels.OPEN_URL, baseUrl(url)) } else { startupUrl = baseUrl(url) + if (app.isReady()) createWindow() } }) diff --git a/src/renderer/App.js b/src/renderer/App.js index 372be1665bbeb..5846ca3a2184d 100644 --- a/src/renderer/App.js +++ b/src/renderer/App.js @@ -2,7 +2,7 @@ import { defineComponent } from 'vue' import { mapActions } from 'vuex' import FtFlexBox from './components/ft-flex-box/ft-flex-box.vue' import TopNav from './components/top-nav/top-nav.vue' -import SideNav from './components/side-nav/side-nav.vue' +import SideNav from './components/SideNav/SideNav.vue' import FtNotificationBanner from './components/ft-notification-banner/ft-notification-banner.vue' import FtPrompt from './components/ft-prompt/ft-prompt.vue' import FtButton from './components/ft-button/ft-button.vue' diff --git a/src/renderer/components/ChannelHome/ChannelHome.vue b/src/renderer/components/ChannelHome/ChannelHome.vue index 31f0dec2f10b4..2e23da23cddc8 100644 --- a/src/renderer/components/ChannelHome/ChannelHome.vue +++ b/src/renderer/components/ChannelHome/ChannelHome.vue @@ -39,7 +39,7 @@ diff --git a/src/renderer/components/ExperimentalSettings/ExperimentalSettings.vue b/src/renderer/components/ExperimentalSettings/ExperimentalSettings.vue index 792dd43532f3f..bec628ef17322 100644 --- a/src/renderer/components/ExperimentalSettings/ExperimentalSettings.vue +++ b/src/renderer/components/ExperimentalSettings/ExperimentalSettings.vue @@ -29,7 +29,7 @@ + +