Skip to content

Commit 3fe78d0

Browse files
committed
Merge branch 'development' into custom-builds/tmp
* development: (57 commits) Translated using Weblate (Ukrainian) Translated using Weblate (Serbian) Translated using Weblate (Hungarian) Translated using Weblate (Icelandic) Translated using Weblate (Estonian) Translated using Weblate (Czech) Translated using Weblate (French) add missing release builds (FreeTubeApp#6415) Translated using Weblate (Serbian) Translated using Weblate (German) Translated using Weblate (Italian) Translated using Weblate (Chinese (Traditional Han script)) apply overflow menu text color change only to overflow menu (not to stats button) (FreeTubeApp#6406) Make a single IPC call for the navigation history (FreeTubeApp#6366) Added buttons to hide hidden channels/text (FreeTubeApp#6156) Translated using Weblate (Serbian) Translated using Weblate (Afrikaans) Translated using Weblate (Afrikaans) Translated using Weblate (Vietnamese) Translated using Weblate (Afrikaans) ...
2 parents 5ee3bf6 + 3b63c9b commit 3fe78d0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1834
-901
lines changed

.github/workflows/release.yml

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,28 @@ jobs:
9595
asset_path: build/FreeTube-${{ steps.getPackageInfo.outputs.version }}.AppImage
9696
asset_content_type: application/vnd.appimage
9797

98+
- name: Upload AppImage ARMv7l Release
99+
uses: actions/upload-release-asset@v1
100+
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-armv7l')
101+
env:
102+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
103+
with:
104+
upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label}
105+
asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-armv7l.AppImage
106+
asset_path: build/FreeTube-${{ steps.getPackageInfo.outputs.version }}-armv7l.AppImage
107+
asset_content_type: application/vnd.appimage
108+
109+
- name: Upload AppImage ARM64 Release
110+
uses: actions/upload-release-asset@v1
111+
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-arm64')
112+
env:
113+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
114+
with:
115+
upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label}
116+
asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-arm64.AppImage
117+
asset_path: build/FreeTube-${{ steps.getPackageInfo.outputs.version }}-arm64.AppImage
118+
asset_content_type: application/vnd.appimage
119+
98120
- name: Upload Linux .zip x64 Release
99121
uses: actions/upload-release-asset@v1
100122
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64')
@@ -371,3 +393,47 @@ jobs:
371393
asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-mac-arm64.7z
372394
asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-arm64-mac.7z
373395
asset_content_type: application/x-7z-compressed
396+
397+
- name: Upload Alpine .apk x64 Release
398+
uses: actions/upload-release-asset@v1
399+
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64')
400+
env:
401+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
402+
with:
403+
upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label}
404+
asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-alpine-amd64.apk
405+
asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}.apk
406+
asset_content_type: application/octet-stream
407+
408+
- name: Upload Alpine .apk ARMv7l Release
409+
uses: actions/upload-release-asset@v1
410+
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-armv7l')
411+
env:
412+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
413+
with:
414+
upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label}
415+
asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-alpine-armv7l.apk
416+
asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-armv7l.apk
417+
asset_content_type: application/octet-stream
418+
419+
- name: Upload Alpine .apk ARM64 Release
420+
uses: actions/upload-release-asset@v1
421+
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-arm64')
422+
env:
423+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
424+
with:
425+
upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label}
426+
asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-alpine-arm64.apk
427+
asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}-arm64.apk
428+
asset_content_type: application/octet-stream
429+
430+
- name: Upload Pacman .pacman x64 Release
431+
uses: actions/upload-release-asset@v1
432+
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64')
433+
env:
434+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
435+
with:
436+
upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ secrets.UPLOAD_ID }}/assets{?name,label}
437+
asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-amd64.pacman
438+
asset_path: build/freetube-${{ steps.getPackageInfo.outputs.version }}.pacman
439+
asset_content_type: application/x-zstd-compressed-tar

README.md

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,18 +60,24 @@ longer track you using cookies or JavaScript. Your subscriptions and history are
6060
* Show/hide functionality or elements within the app using the distraction free settings
6161
* View channel community posts
6262

63-
### Browser Extension
64-
FreeTube is supported by the [Privacy Redirect](https://github.com/SimonBrazell/privacy-redirect) and [LibRedirect](https://github.com/libredirect/libredirect) extensions, which will allow you to open YouTube links into FreeTube.
63+
### Browser Extensions
64+
The following extensions open YouTube links directly in FreeTube:
6565

66-
> [!IMPORTANT]
67-
> You must enable the option within the advanced settings of the extension for it to work.
66+
- [LibRedirect](https://libredirect.github.io/)
67+
- [RedirectTube](https://github.com/MStankiewiczOfficial/RedirectTube)
68+
69+
LibRedirect automatically redirect YouTube links to FreeTube.
70+
> [!IMPORTANT]
71+
> To ensure proper functionality, select FreeTube as Frontend in the Services settings of the extension.
72+
73+
RedirectTube, doesn’t automatically open YouTube links in FreeTube. Instead, it adds buttons to the toolbar and context menu, which you can click to open videos in FreeTube manually.
6874

69-
* Download Privacy Redirect for [Firefox](https://addons.mozilla.org/en-US/firefox/addon/privacy-redirect/) or [Google Chrome](https://chrome.google.com/webstore/detail/privacy-redirect/pmcmeagblkinmogikoikkdjiligflglb).
75+
- Download LibRedirect from [Mozilla Add-ons](https://addons.mozilla.org/firefox/addon/libredirect/) (for Firefox based-browsers) or [developer's website](https://libredirect.github.io/download_chromium.html) (for Chrome and Chromium-based browsers).
7076

71-
* Download LibRedirect for [Firefox](https://addons.mozilla.org/firefox/addon/libredirect/) or [Google Chrome](https://libredirect.github.io/download_chromium.html).
77+
- Download RedirectTube from [Mozilla Add-ons](https://addons.mozilla.org/firefox/addon/redirecttube/) (for Firefox based-browsers).
7278

7379
> [!NOTE]
74-
> This extension does not work on Linux portable builds!
80+
> These extensions do not work on Linux portable builds!
7581
>
7682
> If you have issues with the extension working with FreeTube, please create an issue in this repository instead of the extension repository.
7783

package.json

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "freetube",
33
"productName": "FreeTube",
44
"description": "A private YouTube client",
5-
"version": "0.22.0",
5+
"version": "0.22.1",
66
"license": "AGPL-3.0-or-later",
77
"main": "./dist/main.js",
88
"private": true,
@@ -63,34 +63,34 @@
6363
"autolinker": "^4.0.0",
6464
"electron-context-menu": "^4.0.4",
6565
"lodash.debounce": "^4.0.8",
66-
"marked": "^15.0.3",
66+
"marked": "^15.0.4",
6767
"path-browserify": "^1.0.1",
6868
"portal-vue": "^2.1.7",
6969
"process": "^0.11.10",
70-
"shaka-player": "^4.12.4",
70+
"shaka-player": "^4.12.5",
7171
"swiper": "^11.1.15",
7272
"vue": "^2.7.16",
7373
"vue-i18n": "^8.28.2",
7474
"vue-observe-visibility": "^1.0.0",
7575
"vue-router": "^3.6.5",
7676
"vuex": "^3.6.2",
77-
"youtubei.js": "^12.0.0"
77+
"youtubei.js": "^12.2.0"
7878
},
7979
"devDependencies": {
8080
"@babel/core": "^7.26.0",
8181
"@babel/plugin-transform-class-properties": "^7.25.9",
8282
"@babel/preset-env": "^7.26.0",
8383
"@double-great/stylelint-a11y": "^3.0.2",
84-
"@eslint/js": "^9.16.0",
84+
"@eslint/js": "^9.17.0",
8585
"@intlify/eslint-plugin-vue-i18n": "^3.2.0",
8686
"babel-loader": "^9.2.1",
8787
"copy-webpack-plugin": "^12.0.2",
8888
"css-loader": "^7.1.2",
8989
"css-minimizer-webpack-plugin": "^7.0.0",
9090
"electron": "^33.2.1",
9191
"electron-builder": "^25.1.8",
92-
"eslint": "^9.11.1",
93-
"eslint-plugin-jsdoc": "^50.6.0",
92+
"eslint": "^9.17.0",
93+
"eslint-plugin-jsdoc": "^50.6.1",
9494
"eslint-plugin-jsonc": "^2.18.2",
9595
"eslint-plugin-unicorn": "^56.0.1",
9696
"eslint-plugin-vue": "^9.32.0",
@@ -100,16 +100,16 @@
100100
"html-webpack-plugin": "^5.6.3",
101101
"js-yaml": "^4.1.0",
102102
"json-minimizer-webpack-plugin": "^5.0.0",
103-
"lefthook": "^1.9.0",
103+
"lefthook": "^1.9.2",
104104
"mini-css-extract-plugin": "^2.9.2",
105-
"neostandard": "^0.11.9",
105+
"neostandard": "^0.12.0",
106106
"npm-run-all2": "^7.0.1",
107107
"postcss": "^8.4.49",
108108
"postcss-scss": "^4.0.9",
109109
"rimraf": "^6.0.1",
110-
"sass": "^1.82.0",
110+
"sass": "^1.83.0",
111111
"sass-loader": "^16.0.4",
112-
"stylelint": "^16.11.0",
112+
"stylelint": "^16.12.0",
113113
"stylelint-config-sass-guidelines": "^12.1.0",
114114
"stylelint-config-standard": "^36.0.1",
115115
"stylelint-high-performance-animation": "^1.10.0",
@@ -120,7 +120,7 @@
120120
"vue-loader": "^15.10.0",
121121
"webpack": "^5.97.1",
122122
"webpack-cli": "^5.1.4",
123-
"webpack-dev-server": "^5.1.0",
123+
"webpack-dev-server": "^5.2.0",
124124
"yaml-eslint-parser": "^1.2.3"
125125
}
126126
}

src/constants.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@ const IpcChannels = {
55
OPEN_EXTERNAL_LINK: 'open-external-link',
66
GET_SYSTEM_LOCALE: 'get-system-locale',
77
GET_PICTURES_PATH: 'get-pictures-path',
8-
GET_NAV_HISTORY_ENTRY_TITLE_AT_INDEX: 'get-navigation-history-entry-at-index',
9-
GET_NAV_HISTORY_ACTIVE_INDEX: 'get-navigation-history-active-index',
10-
GET_NAV_HISTORY_LENGTH: 'get-navigation-history-length',
11-
GO_TO_NAV_HISTORY_OFFSET: 'go-to-navigation-history-index',
8+
GET_NAVIGATION_HISTORY: 'get-navigation-history',
129
SHOW_OPEN_DIALOG: 'show-open-dialog',
1310
SHOW_SAVE_DIALOG: 'show-save-dialog',
1411
STOP_POWER_SAVE_BLOCKER: 'stop-power-save-blocker',

src/datastores/handlers/base.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ class Playlists {
183183
return db.playlists.removeAsync({ _id, protected: { $ne: true } })
184184
}
185185

186-
static deleteVideoIdByPlaylistId({ _id, videoId, playlistItemId }) {
186+
static deleteVideoIdByPlaylistId(_id, videoId, playlistItemId) {
187187
if (playlistItemId != null) {
188188
return db.playlists.updateAsync(
189189
{ _id },
@@ -231,31 +231,31 @@ class SubscriptionCache {
231231
return db.subscriptionCache.findAsync({})
232232
}
233233

234-
static updateVideosByChannelId({ channelId, entries, timestamp }) {
234+
static updateVideosByChannelId(channelId, entries, timestamp) {
235235
return db.subscriptionCache.updateAsync(
236236
{ _id: channelId },
237237
{ $set: { videos: entries, videosTimestamp: timestamp } },
238238
{ upsert: true }
239239
)
240240
}
241241

242-
static updateLiveStreamsByChannelId({ channelId, entries, timestamp }) {
242+
static updateLiveStreamsByChannelId(channelId, entries, timestamp) {
243243
return db.subscriptionCache.updateAsync(
244244
{ _id: channelId },
245245
{ $set: { liveStreams: entries, liveStreamsTimestamp: timestamp } },
246246
{ upsert: true }
247247
)
248248
}
249249

250-
static updateShortsByChannelId({ channelId, entries, timestamp }) {
250+
static updateShortsByChannelId(channelId, entries, timestamp) {
251251
return db.subscriptionCache.updateAsync(
252252
{ _id: channelId },
253253
{ $set: { shorts: entries, shortsTimestamp: timestamp } },
254254
{ upsert: true }
255255
)
256256
}
257257

258-
static updateShortsWithChannelPageShortsByChannelId({ channelId, entries }) {
258+
static updateShortsWithChannelPageShortsByChannelId(channelId, entries) {
259259
return db.subscriptionCache.findOneAsync({ _id: channelId }, { shorts: 1 }).then((doc) => {
260260
if (doc == null) { return }
261261

@@ -288,7 +288,7 @@ class SubscriptionCache {
288288
})
289289
}
290290

291-
static updateCommunityPostsByChannelId({ channelId, entries, timestamp }) {
291+
static updateCommunityPostsByChannelId(channelId, entries, timestamp) {
292292
return db.subscriptionCache.updateAsync(
293293
{ _id: channelId },
294294
{ $set: { communityPosts: entries, communityPostsTimestamp: timestamp } },

src/datastores/handlers/electron.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ class Playlists {
173173
)
174174
}
175175

176-
static deleteVideoIdByPlaylistId({ _id, videoId, playlistItemId }) {
176+
static deleteVideoIdByPlaylistId(_id, videoId, playlistItemId) {
177177
return ipcRenderer.invoke(
178178
IpcChannels.DB_PLAYLISTS,
179179
{
@@ -226,7 +226,7 @@ class SubscriptionCache {
226226
)
227227
}
228228

229-
static updateVideosByChannelId({ channelId, entries, timestamp }) {
229+
static updateVideosByChannelId(channelId, entries, timestamp) {
230230
return ipcRenderer.invoke(
231231
IpcChannels.DB_SUBSCRIPTION_CACHE,
232232
{
@@ -236,7 +236,7 @@ class SubscriptionCache {
236236
)
237237
}
238238

239-
static updateLiveStreamsByChannelId({ channelId, entries, timestamp }) {
239+
static updateLiveStreamsByChannelId(channelId, entries, timestamp) {
240240
return ipcRenderer.invoke(
241241
IpcChannels.DB_SUBSCRIPTION_CACHE,
242242
{
@@ -246,7 +246,7 @@ class SubscriptionCache {
246246
)
247247
}
248248

249-
static updateShortsByChannelId({ channelId, entries, timestamp }) {
249+
static updateShortsByChannelId(channelId, entries, timestamp) {
250250
return ipcRenderer.invoke(
251251
IpcChannels.DB_SUBSCRIPTION_CACHE,
252252
{
@@ -256,7 +256,7 @@ class SubscriptionCache {
256256
)
257257
}
258258

259-
static updateShortsWithChannelPageShortsByChannelId({ channelId, entries }) {
259+
static updateShortsWithChannelPageShortsByChannelId(channelId, entries) {
260260
return ipcRenderer.invoke(
261261
IpcChannels.DB_SUBSCRIPTION_CACHE,
262262
{
@@ -266,7 +266,7 @@ class SubscriptionCache {
266266
)
267267
}
268268

269-
static updateCommunityPostsByChannelId({ channelId, entries, timestamp }) {
269+
static updateCommunityPostsByChannelId(channelId, entries, timestamp) {
270270
return ipcRenderer.invoke(
271271
IpcChannels.DB_SUBSCRIPTION_CACHE,
272272
{

src/datastores/handlers/web.js

Lines changed: 12 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ class Playlists {
101101
return baseHandlers.playlists.delete(_id)
102102
}
103103

104-
static deleteVideoIdByPlaylistId({ _id, videoId, playlistItemId }) {
105-
return baseHandlers.playlists.deleteVideoIdByPlaylistId({ _id, videoId, playlistItemId })
104+
static deleteVideoIdByPlaylistId(_id, videoId, playlistItemId) {
105+
return baseHandlers.playlists.deleteVideoIdByPlaylistId(_id, videoId, playlistItemId)
106106
}
107107

108108
static deleteVideoIdsByPlaylistId(_id, videoIds) {
@@ -127,43 +127,24 @@ class SubscriptionCache {
127127
return baseHandlers.subscriptionCache.find()
128128
}
129129

130-
static updateVideosByChannelId({ channelId, entries, timestamp }) {
131-
return baseHandlers.subscriptionCache.updateVideosByChannelId({
132-
channelId,
133-
entries,
134-
timestamp,
135-
})
130+
static updateVideosByChannelId(channelId, entries, timestamp) {
131+
return baseHandlers.subscriptionCache.updateVideosByChannelId(channelId, entries, timestamp)
136132
}
137133

138-
static updateLiveStreamsByChannelId({ channelId, entries, timestamp }) {
139-
return baseHandlers.subscriptionCache.updateLiveStreamsByChannelId({
140-
channelId,
141-
entries,
142-
timestamp,
143-
})
134+
static updateLiveStreamsByChannelId(channelId, entries, timestamp) {
135+
return baseHandlers.subscriptionCache.updateLiveStreamsByChannelId(channelId, entries, timestamp)
144136
}
145137

146-
static updateShortsByChannelId({ channelId, entries, timestamp }) {
147-
return baseHandlers.subscriptionCache.updateShortsByChannelId({
148-
channelId,
149-
entries,
150-
timestamp,
151-
})
138+
static updateShortsByChannelId(channelId, entries, timestamp) {
139+
return baseHandlers.subscriptionCache.updateShortsByChannelId(channelId, entries, timestamp)
152140
}
153141

154-
static updateShortsWithChannelPageShortsByChannelId({ channelId, entries }) {
155-
return baseHandlers.subscriptionCache.updateShortsWithChannelPageShortsByChannelId({
156-
channelId,
157-
entries,
158-
})
142+
static updateShortsWithChannelPageShortsByChannelId(channelId, entries) {
143+
return baseHandlers.subscriptionCache.updateShortsWithChannelPageShortsByChannelId(channelId, entries)
159144
}
160145

161-
static updateCommunityPostsByChannelId({ channelId, entries, timestamp }) {
162-
return baseHandlers.subscriptionCache.updateCommunityPostsByChannelId({
163-
channelId,
164-
entries,
165-
timestamp,
166-
})
146+
static updateCommunityPostsByChannelId(channelId, entries, timestamp) {
147+
return baseHandlers.subscriptionCache.updateCommunityPostsByChannelId(channelId, entries, timestamp)
167148
}
168149

169150
static deleteMultipleChannels(channelIds) {

0 commit comments

Comments
 (0)