Webpack bundle dependencies (#2511)

* Allow webpack to bundle *most* dependencies

* Exclude *most* node_modules from getting packaged by electron-builder

* Import only the required icons instead of bundling the whole icon pack

* Reduce packaging blacklist to only include the few things that still need blacklisting
This commit is contained in:
absidue 2022-09-06 04:29:10 +02:00 committed by GitHub
parent a453c8436e
commit eaa15ea833
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 208 additions and 119 deletions

View File

@ -58,22 +58,14 @@ const config = {
'icon.svg', 'icon.svg',
'./dist/**/*', './dist/**/*',
'!dist/web/*', '!dist/web/*',
'!**/node_modules/**/.*', '!node_modules/**/*',
'!**/node_modules/**/index.html',
'!**/{.github,Jenkinsfile}',
'!**/{CHANGES.md,CODE_OF_CONDUCT.md,CONTRIBUTING.md,CONTRIBUTION.md,DEVELOPMENT.md,docs,docs.md,docs.mli,examples,History.md,HISTORY.md,README.md,TODO.md,UPGRADE_GUIDE.md,UPGRADING.md}',
'!**/{commitlint.config.js,.editorconfig,.eslintignore,.eslintrc.{js,yml},.gitmodules,.huskyrc,.lintstagedrc,.nvmrc,.nycrc{,.json},.prettierrc{,.yaml},tslint.json}',
'!**/{.babelrc,bower.json,Gruntfile.js,Makefile,.npmrc.proregistry,rollup.config.js,.tm_properties,.tool-versions,tsconfig.json,webpack.config.js}',
'!**/*.{{,c,m}js,min,ts}.map',
'!**/*.d.ts',
// only exclude the src directory for specific packages // renderer
// as some of them have their dist code in there and we don't want to exclude those 'node_modules/{miniget,ytpl,ytsr}/**/*',
'!**/node_modules/{@fortawesome/vue-fontawesome,agent-base,jquery,localforage,m3u8-parser,marked,mpd-parser,performance-now,video.js,vue,vue-i18n,vue-router}/src/*',
'!**/node_modules/**/{bin,man,scripts}/*', '!**/README.md',
'!**/node_modules/jquery/dist/jquery.slim*.js', '!**/*.js.map',
'!**/node_modules/video.js/dist/{alt/*,video.js}', '!**/*.d.ts',
'!**/node_modules/@videojs/*/src'
], ],
dmg: { dmg: {
contents: [ contents: [

View File

@ -2,15 +2,9 @@ const path = require('path')
const webpack = require('webpack') const webpack = require('webpack')
const CopyWebpackPlugin = require('copy-webpack-plugin') const CopyWebpackPlugin = require('copy-webpack-plugin')
const { const { productName } = require('../package.json')
dependencies,
devDependencies,
productName,
} = require('../package.json')
const externals = Object.keys(dependencies).concat(Object.keys(devDependencies))
const isDevMode = process.env.NODE_ENV === 'development' const isDevMode = process.env.NODE_ENV === 'development'
const whiteListedModules = []
const config = { const config = {
name: 'main', name: 'main',
@ -19,7 +13,10 @@ const config = {
entry: { entry: {
main: path.join(__dirname, '../src/main/index.js'), main: path.join(__dirname, '../src/main/index.js'),
}, },
externals: externals.filter(d => !whiteListedModules.includes(d)), // webpack spits out errors while inlining electron-debug as
// it tries to dynamically load dependencies
// the error: "Critical dependency: the request of a dependency is an expression"
externals: ['electron-debug'],
module: { module: {
rules: [ rules: [
{ {

View File

@ -4,15 +4,9 @@ const HtmlWebpackPlugin = require('html-webpack-plugin')
const VueLoaderPlugin = require('vue-loader/lib/plugin') const VueLoaderPlugin = require('vue-loader/lib/plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin') const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const { const { productName } = require('../package.json')
dependencies,
devDependencies,
productName,
} = require('../package.json')
const externals = Object.keys(dependencies).concat(Object.keys(devDependencies))
const isDevMode = process.env.NODE_ENV === 'development' const isDevMode = process.env.NODE_ENV === 'development'
const whiteListedModules = ['vue']
const config = { const config = {
name: 'renderer', name: 'renderer',
@ -32,7 +26,10 @@ const config = {
path: path.join(__dirname, '../dist'), path: path.join(__dirname, '../dist'),
filename: '[name].js', filename: '[name].js',
}, },
externals: externals.filter(d => !whiteListedModules.includes(d)), // webpack spits out errors while inlining ytpl and ytsr as
// they dynamically import their package.json file to extract the bug report URL
// the error: "Critical dependency: the request of a dependency is an expression"
externals: ['ytpl', 'ytsr'],
module: { module: {
rules: [ rules: [
{ {

View File

@ -12,7 +12,7 @@
class="bubble selected" class="bubble selected"
> >
<font-awesome-icon <font-awesome-icon
icon="check" :icon="['fas', 'check']"
class="icon" class="icon"
/> />
</div> </div>

View File

@ -9,8 +9,8 @@ export default Vue.extend({
default: '' default: ''
}, },
icon: { icon: {
type: String, type: Array,
default: 'ellipsis-v' default: () => ['fas', 'ellipsis-v']
}, },
theme: { theme: {
type: String, type: String,

View File

@ -67,7 +67,7 @@ export default Vue.extend({
// As the text input box should be empty // As the text input box should be empty
clearTextButtonExisting: false, clearTextButtonExisting: false,
clearTextButtonVisible: false, clearTextButtonVisible: false,
actionButtonIconName: 'search' actionButtonIconName: ['fas', 'search']
} }
}, },
computed: { computed: {
@ -136,7 +136,7 @@ export default Vue.extend({
if (!this.inputDataPresent) { if (!this.inputDataPresent) {
// Change back to default icon if text is blank // Change back to default icon if text is blank
this.actionButtonIconName = 'search' this.actionButtonIconName = ['fas', 'search']
return return
} }
@ -165,15 +165,15 @@ export default Vue.extend({
if (isYoutubeLink) { if (isYoutubeLink) {
// Go to URL (i.e. Video/Playlist/Channel // Go to URL (i.e. Video/Playlist/Channel
this.actionButtonIconName = 'arrow-right' this.actionButtonIconName = ['fas', 'arrow-right']
} else { } else {
// Search with text // Search with text
this.actionButtonIconName = 'search' this.actionButtonIconName = ['fas', 'search']
} }
}) })
} catch (ex) { } catch (ex) {
// On exception, consider text as invalid URL // On exception, consider text as invalid URL
this.actionButtonIconName = 'search' this.actionButtonIconName = ['fas', 'search']
// Rethrow exception // Rethrow exception
throw ex throw ex
} }

View File

@ -24,7 +24,7 @@
</label> </label>
<font-awesome-icon <font-awesome-icon
v-if="showClearTextButton" v-if="showClearTextButton"
icon="times-circle" :icon="['fas', 'times-circle']"
class="clearInputTextButton" class="clearInputTextButton"
:class="{ :class="{
visible: inputDataPresent visible: inputDataPresent

View File

@ -4,7 +4,7 @@
{{ title }} {{ title }}
<font-awesome-icon <font-awesome-icon
class="angleDownIcon" class="angleDownIcon"
icon="angle-down" :icon="['fas', 'angle-down']"
/> />
</div> </div>
<ul> <ul>

View File

@ -18,7 +18,7 @@
<div class="background" /> <div class="background" />
<div class="inner"> <div class="inner">
<div>{{ videoCount }}</div> <div>{{ videoCount }}</div>
<div><font-awesome-icon icon="list" /></div> <div><font-awesome-icon :icon="['fas','list']" /></div>
</div> </div>
</div> </div>
</router-link> </router-link>
@ -26,7 +26,7 @@
<ft-icon-button <ft-icon-button
v-if="externalPlayer !== ''" v-if="externalPlayer !== ''"
:title="$t('Video.External Player.OpenInTemplate').replace('$', externalPlayer)" :title="$t('Video.External Player.OpenInTemplate').replace('$', externalPlayer)"
icon="external-link-alt" :icon="['fas', 'external-link-alt']"
class="externalPlayerButton" class="externalPlayerButton"
theme="base-no-default" theme="base-no-default"
:size="16" :size="16"

View File

@ -34,7 +34,7 @@
<ft-icon-button <ft-icon-button
v-if="externalPlayer !== ''" v-if="externalPlayer !== ''"
:title="$t('Video.External Player.OpenInTemplate').replace('$', externalPlayer)" :title="$t('Video.External Player.OpenInTemplate').replace('$', externalPlayer)"
icon="external-link-alt" :icon="['fas', 'external-link-alt']"
class="externalPlayerIcon" class="externalPlayerIcon"
theme="base" theme="base"
:padding="appearance === `watchPlaylistItem` ? 6 : 7" :padding="appearance === `watchPlaylistItem` ? 6 : 7"
@ -44,7 +44,7 @@
<ft-icon-button <ft-icon-button
v-if="!isLive" v-if="!isLive"
:title="$t('Video.Save Video')" :title="$t('Video.Save Video')"
icon="star" :icon="['fas', 'star']"
class="favoritesIcon" class="favoritesIcon"
:theme="favoriteIconTheme" :theme="favoriteIconTheme"
:padding="appearance === `watchPlaylistItem` ? 5 : 6" :padding="appearance === `watchPlaylistItem` ? 5 : 6"
@ -66,7 +66,7 @@
<div class="info"> <div class="info">
<ft-icon-button <ft-icon-button
class="optionsButton" class="optionsButton"
icon="ellipsis-v" :icon="['fas', 'ellipsis-v']"
title="More Options" title="More Options"
theme="base-no-default" theme="base-no-default"
:size="16" :size="16"

View File

@ -14,7 +14,7 @@
</div> </div>
<font-awesome-icon <font-awesome-icon
class="bannerIcon" class="bannerIcon"
icon="times" :icon="['fas', 'times']"
@click="handleClose" @click="handleClose"
/> />
</div> </div>

View File

@ -22,7 +22,7 @@
</h3> </h3>
<ft-icon-button <ft-icon-button
class="profileSettings" class="profileSettings"
icon="sliders-h" :icon="['fas', 'sliders-h']"
@click="openProfileSettings" @click="openProfileSettings"
/> />
<div <div

View File

@ -16,7 +16,7 @@
</option> </option>
</select> </select>
<font-awesome-icon <font-awesome-icon
icon="sort-down" :icon="['fas', 'sort-down']"
class="iconSelect" class="iconSelect"
/> />
<span class="select-highlight" /> <span class="select-highlight" />

View File

@ -3,7 +3,7 @@
ref="iconButton" ref="iconButton"
:title="$t('Share.Share Video')" :title="$t('Share.Share Video')"
theme="secondary" theme="secondary"
icon="share-alt" :icon="['fas', 'share-alt']"
dropdown-position-x="left" dropdown-position-x="left"
:force-dropdown="true" :force-dropdown="true"
> >
@ -31,14 +31,14 @@
class="action" class="action"
@click="copyYoutube()" @click="copyYoutube()"
> >
<font-awesome-icon icon="copy" /> <font-awesome-icon :icon="['fas', 'copy']" />
{{ $t("Share.Copy Link") }} {{ $t("Share.Copy Link") }}
</ft-button> </ft-button>
<ft-button <ft-button
class="action" class="action"
@click="openYoutube()" @click="openYoutube()"
> >
<font-awesome-icon icon="globe" /> <font-awesome-icon :icon="['fas', 'globe']" />
{{ $t("Share.Open Link") }} {{ $t("Share.Open Link") }}
</ft-button> </ft-button>
<ft-button <ft-button
@ -46,7 +46,7 @@
background-color="var(--accent-color-active)" background-color="var(--accent-color-active)"
@click="copyYoutubeEmbed()" @click="copyYoutubeEmbed()"
> >
<font-awesome-icon icon="copy" /> <font-awesome-icon :icon="['fas', 'copy']" />
{{ $t("Share.Copy Embed") }} {{ $t("Share.Copy Embed") }}
</ft-button> </ft-button>
<ft-button <ft-button
@ -54,7 +54,7 @@
background-color="var(--accent-color-active)" background-color="var(--accent-color-active)"
@click="openYoutubeEmbed()" @click="openYoutubeEmbed()"
> >
<font-awesome-icon icon="globe" /> <font-awesome-icon :icon="['fas', 'globe']" />
{{ $t("Share.Open Embed") }} {{ $t("Share.Open Embed") }}
</ft-button> </ft-button>
</div> </div>
@ -70,14 +70,14 @@
class="action" class="action"
@click="copyInvidious()" @click="copyInvidious()"
> >
<font-awesome-icon icon="copy" /> <font-awesome-icon :icon="['fas', 'copy']" />
{{ $t("Share.Copy Link") }} {{ $t("Share.Copy Link") }}
</ft-button> </ft-button>
<ft-button <ft-button
class="action" class="action"
@click="openInvidious()" @click="openInvidious()"
> >
<font-awesome-icon icon="globe" /> <font-awesome-icon :icon="['fas', 'globe']" />
{{ $t("Share.Open Link") }} {{ $t("Share.Open Link") }}
</ft-button> </ft-button>
<ft-button <ft-button
@ -85,7 +85,7 @@
background-color="var(--accent-color-active)" background-color="var(--accent-color-active)"
@click="copyInvidiousEmbed()" @click="copyInvidiousEmbed()"
> >
<font-awesome-icon icon="copy" /> <font-awesome-icon :icon="['fas', 'copy']" />
{{ $t("Share.Copy Embed") }} {{ $t("Share.Copy Embed") }}
</ft-button> </ft-button>
<ft-button <ft-button
@ -93,7 +93,7 @@
background-color="var(--accent-color-active)" background-color="var(--accent-color-active)"
@click="openInvidiousEmbed()" @click="openInvidiousEmbed()"
> >
<font-awesome-icon icon="globe" /> <font-awesome-icon :icon="['fas', 'globe']" />
{{ $t("Share.Open Embed") }} {{ $t("Share.Open Embed") }}
</ft-button> </ft-button>
</div> </div>

View File

@ -5,7 +5,7 @@
class="button" class="button"
type="button" type="button"
> >
<font-awesome-icon icon="question-circle" /> <font-awesome-icon :icon="['fas', 'question-circle']" />
</button> </button>
<p <p
:id="id" :id="id"

View File

@ -6,7 +6,7 @@
@click="openMoreOptions = !openMoreOptions" @click="openMoreOptions = !openMoreOptions"
> >
<font-awesome-icon <font-awesome-icon
icon="ellipsis-h" :icon="['fas', 'ellipsis-h']"
class="navIcon" class="navIcon"
:class="applyNavIconExpand" :class="applyNavIconExpand"
/> />
@ -32,7 +32,7 @@
class="thumbnailContainer" class="thumbnailContainer"
> >
<font-awesome-icon <font-awesome-icon
icon="list" :icon="['fas', 'list']"
class="navIcon" class="navIcon"
:class="applyNavIconExpand" :class="applyNavIconExpand"
fixed-width fixed-width
@ -52,7 +52,7 @@
@click="navigate('trending')" @click="navigate('trending')"
> >
<font-awesome-icon <font-awesome-icon
icon="fire" :icon="['fas', 'fire']"
class="navIcon" class="navIcon"
:class="applyNavIconExpand" :class="applyNavIconExpand"
/> />
@ -70,7 +70,7 @@
@click="navigate('popular')" @click="navigate('popular')"
> >
<font-awesome-icon <font-awesome-icon
icon="users" :icon="['fas', 'users']"
class="navIcon" class="navIcon"
:class="applyNavIconExpand" :class="applyNavIconExpand"
/> />
@ -87,7 +87,7 @@
@click="navigate('about')" @click="navigate('about')"
> >
<font-awesome-icon <font-awesome-icon
icon="info-circle" :icon="['fas', 'info-circle']"
class="navIcon" class="navIcon"
:class="applyNavIconExpand" :class="applyNavIconExpand"
/> />
@ -104,7 +104,7 @@
@click="navigate('history')" @click="navigate('history')"
> >
<font-awesome-icon <font-awesome-icon
icon="history" :icon="['fas', 'history']"
class="navIcon" class="navIcon"
:class="applyNavIconExpand" :class="applyNavIconExpand"
/> />
@ -118,7 +118,7 @@
@click="navigate('settings')" @click="navigate('settings')"
> >
<font-awesome-icon <font-awesome-icon
icon="sliders-h" :icon="['fas', 'sliders-h']"
class="navIcon" class="navIcon"
:class="applyNavIconExpand" :class="applyNavIconExpand"
/> />
@ -131,7 +131,7 @@
@click="navigate('about')" @click="navigate('about')"
> >
<font-awesome-icon <font-awesome-icon
icon="info-circle" :icon="['fas', 'info-circle']"
class="navIcon" class="navIcon"
:class="applyNavIconExpand" :class="applyNavIconExpand"
/> />

View File

@ -19,7 +19,7 @@
class="thumbnailContainer" class="thumbnailContainer"
> >
<font-awesome-icon <font-awesome-icon
icon="rss" :icon="['fas', 'rss']"
class="navIcon" class="navIcon"
:class="applyNavIconExpand" :class="applyNavIconExpand"
fixed-width fixed-width
@ -43,7 +43,7 @@
class="thumbnailContainer" class="thumbnailContainer"
> >
<font-awesome-icon <font-awesome-icon
icon="list" :icon="['fas', 'list']"
class="navIcon" class="navIcon"
:class="applyNavIconExpand" :class="applyNavIconExpand"
fixed-width fixed-width
@ -69,7 +69,7 @@
class="thumbnailContainer" class="thumbnailContainer"
> >
<font-awesome-icon <font-awesome-icon
icon="fire" :icon="['fas', 'fire']"
class="navIcon" class="navIcon"
:class="applyNavIconExpand" :class="applyNavIconExpand"
fixed-width fixed-width
@ -95,7 +95,7 @@
class="thumbnailContainer" class="thumbnailContainer"
> >
<font-awesome-icon <font-awesome-icon
icon="users" :icon="['fas', 'users']"
class="navIcon" class="navIcon"
:class="applyNavIconExpand" :class="applyNavIconExpand"
fixed-width fixed-width
@ -121,7 +121,7 @@
class="thumbnailContainer" class="thumbnailContainer"
> >
<font-awesome-icon <font-awesome-icon
icon="bookmark" :icon="['fas', 'bookmark']"
class="navIcon" class="navIcon"
:class="applyNavIconExpand" :class="applyNavIconExpand"
fixed-width fixed-width
@ -149,7 +149,7 @@
class="thumbnailContainer" class="thumbnailContainer"
> >
<font-awesome-icon <font-awesome-icon
icon="history" :icon="['fas', 'history']"
class="navIcon" class="navIcon"
:class="applyNavIconExpand" :class="applyNavIconExpand"
fixed-width fixed-width
@ -175,7 +175,7 @@
class="thumbnailContainer" class="thumbnailContainer"
> >
<font-awesome-icon <font-awesome-icon
icon="sliders-h" :icon="['fas', 'sliders-h']"
class="navIcon" class="navIcon"
:class="applyNavIconExpand" :class="applyNavIconExpand"
fixed-width fixed-width
@ -200,7 +200,7 @@
class="thumbnailContainer" class="thumbnailContainer"
> >
<font-awesome-icon <font-awesome-icon
icon="info-circle" :icon="['fas', 'info-circle']"
class="navIcon" class="navIcon"
:class="applyNavIconExpand" :class="applyNavIconExpand"
fixed-width fixed-width

View File

@ -6,7 +6,7 @@
<div class="side"> <div class="side">
<font-awesome-icon <font-awesome-icon
class="menuIcon navIcon" class="menuIcon navIcon"
icon="bars" :icon="['fas', 'bars']"
role="button" role="button"
tabindex="0" tabindex="0"
@click="toggleSideNav" @click="toggleSideNav"
@ -15,7 +15,7 @@
<font-awesome-icon <font-awesome-icon
id="historyArrowBack" id="historyArrowBack"
class="navBackIcon navIcon fa-arrow-left" class="navBackIcon navIcon fa-arrow-left"
icon="arrow-left" :icon="['fas', 'arrow-left']"
role="button" role="button"
tabindex="0" tabindex="0"
:title="backwardText" :title="backwardText"
@ -25,7 +25,7 @@
<font-awesome-icon <font-awesome-icon
id="historyArrowForward" id="historyArrowForward"
class="navForwardIcon navIcon fa-arrow-right" class="navForwardIcon navIcon fa-arrow-right"
icon="arrow-right" :icon="['fas', 'arrow-right']"
role="button" role="button"
tabindex="0" tabindex="0"
:title="forwardText" :title="forwardText"
@ -35,7 +35,7 @@
<font-awesome-icon <font-awesome-icon
v-if="!hideSearchBar" v-if="!hideSearchBar"
class="navSearchIcon navIcon" class="navSearchIcon navIcon"
icon="search" :icon="['fas', 'search']"
role="button" role="button"
tabindex="0" tabindex="0"
@click="toggleSearchContainer" @click="toggleSearchContainer"
@ -43,7 +43,7 @@
/> />
<font-awesome-icon <font-awesome-icon
class="navNewWindowIcon navIcon" class="navNewWindowIcon navIcon"
icon="clone" :icon="['fas', 'clone']"
:title="newWindowText" :title="newWindowText"
@click="createNewWindow" @click="createNewWindow"
/> />
@ -83,7 +83,7 @@
v-if="!hideSearchBar" v-if="!hideSearchBar"
class="navFilterIcon navIcon" class="navFilterIcon navIcon"
:class="{ filterChanged: searchFilterValueChanged }" :class="{ filterChanged: searchFilterValueChanged }"
icon="filter" :icon="['fas', 'filter']"
role="button" role="button"
tabindex="0" tabindex="0"
@click="showFilters = !showFilters" @click="showFilters = !showFilters"

View File

@ -52,7 +52,7 @@
class="commentPinned" class="commentPinned"
> >
<font-awesome-icon <font-awesome-icon
icon="thumbtack" :icon="['fas', 'thumbtack']"
/> />
{{ $t("Comments.Pinned by") }} {{ channelName }} {{ $t("Comments.Pinned by") }} {{ channelName }}
</p> </p>
@ -88,7 +88,7 @@
<p class="commentLikeCount"> <p class="commentLikeCount">
<font-awesome-icon <font-awesome-icon
v-if="!hideCommentLikes" v-if="!hideCommentLikes"
icon="thumbs-up" :icon="['fas', 'thumbs-up']"
/> />
{{ comment.likes }} {{ comment.likes }}
<span <span
@ -100,11 +100,11 @@
class="commentHeartBadgeImg" class="commentHeartBadgeImg"
> >
<font-awesome-icon <font-awesome-icon
icon="heart" :icon="['fas', 'heart']"
class="commentHeartBadgeWhite" class="commentHeartBadgeWhite"
/> />
<font-awesome-icon <font-awesome-icon
icon="heart" :icon="['fas', 'heart']"
class="commentHeartBadgeRed" class="commentHeartBadgeRed"
/> />
</span> </span>
@ -163,7 +163,7 @@
<p class="commentLikeCount"> <p class="commentLikeCount">
<font-awesome-icon <font-awesome-icon
v-if="!hideCommentLikes" v-if="!hideCommentLikes"
icon="thumbs-up" :icon="['fas', 'thumbs-up']"
/> />
{{ reply.likes }} {{ reply.likes }}
</p> </p>

View File

@ -53,7 +53,7 @@
class="likeSection" class="likeSection"
> >
<div> <div>
<span class="likeCount"><font-awesome-icon icon="thumbs-up" /> {{ parsedLikeCount }}</span> <span class="likeCount"><font-awesome-icon :icon="['fas', 'thumbs-up']" /> {{ parsedLikeCount }}</span>
</div> </div>
</div> </div>
</div> </div>
@ -71,8 +71,8 @@
:style="{ background: `linear-gradient(to right, var(--accent-color) ${likePercentageRatio}%, #9E9E9E ${likePercentageRatio}%` }" :style="{ background: `linear-gradient(to right, var(--accent-color) ${likePercentageRatio}%, #9E9E9E ${likePercentageRatio}%` }"
/> />
<div> <div>
<span class="likeCount"><font-awesome-icon icon="thumbs-up" /> {{ parsedLikeCount }}</span> <span class="likeCount"><font-awesome-icon :icon="['fas', 'thumbs-up']" /> {{ parsedLikeCount }}</span>
<span class="dislikeCount"><font-awesome-icon icon="thumbs-down" /> {{ parsedDislikeCount }}</span> <span class="dislikeCount"><font-awesome-icon :icon="['fas', 'thumbs-down']" /> {{ parsedDislikeCount }}</span>
</div> </div>
</div> </div>
</div> </div>
@ -81,7 +81,7 @@
<ft-icon-button <ft-icon-button
v-if="!isUpcoming" v-if="!isUpcoming"
:title="$t('Video.Save Video')" :title="$t('Video.Save Video')"
icon="star" :icon="['fas', 'star']"
class="option" class="option"
:theme="favoriteIconTheme" :theme="favoriteIconTheme"
@click="toggleSave" @click="toggleSave"
@ -89,7 +89,7 @@
<ft-icon-button <ft-icon-button
v-if="externalPlayer !== ''" v-if="externalPlayer !== ''"
:title="$t('Video.External Player.OpenInTemplate').replace('$', externalPlayer)" :title="$t('Video.External Player.OpenInTemplate').replace('$', externalPlayer)"
icon="external-link-alt" :icon="['fas', 'external-link-alt']"
class="option" class="option"
theme="secondary" theme="secondary"
@click="handleExternalPlayer" @click="handleExternalPlayer"
@ -100,7 +100,7 @@
:title="$t('Video.Download Video')" :title="$t('Video.Download Video')"
class="option" class="option"
theme="secondary" theme="secondary"
icon="download" :icon="['fas', 'download']"
:return-index="true" :return-index="true"
:dropdown-options="downloadLinkOptions" :dropdown-options="downloadLinkOptions"
@click="handleDownload" @click="handleDownload"
@ -110,7 +110,7 @@
:title="$t('Change Format.Change Media Formats')" :title="$t('Change Format.Change Media Formats')"
class="option" class="option"
theme="secondary" theme="secondary"
icon="file-video" :icon="['fas', 'file-video']"
:dropdown-options="formatTypeOptions" :dropdown-options="formatTypeOptions"
@click="handleFormatChange" @click="handleFormatChange"
/> />

View File

@ -16,7 +16,7 @@
{{ errorMessage }} {{ errorMessage }}
</p> </p>
<font-awesome-icon <font-awesome-icon
icon="exclamation-circle" :icon="['fas', 'exclamation-circle']"
class="errorIcon" class="errorIcon"
/> />
<ft-button <ft-button
@ -190,7 +190,7 @@
> >
<font-awesome-icon <font-awesome-icon
class="icon" class="icon"
icon="arrow-down" :icon="['fas', 'arrow-down']"
/> />
</div> </div>
</div> </div>

View File

@ -33,33 +33,33 @@
<font-awesome-icon <font-awesome-icon
class="playlistIcon" class="playlistIcon"
:class="{ playlistIconActive: loopEnabled }" :class="{ playlistIconActive: loopEnabled }"
icon="retweet" :icon="['fas', 'retweet']"
:title="$t('Video.Loop Playlist')" :title="$t('Video.Loop Playlist')"
@click="toggleLoop" @click="toggleLoop"
/> />
<font-awesome-icon <font-awesome-icon
class="playlistIcon" class="playlistIcon"
:class="{ playlistIconActive: shuffleEnabled }" :class="{ playlistIconActive: shuffleEnabled }"
icon="random" :icon="['fas', 'random']"
:title="$t('Video.Shuffle Playlist')" :title="$t('Video.Shuffle Playlist')"
@click="toggleShuffle" @click="toggleShuffle"
/> />
<font-awesome-icon <font-awesome-icon
class="playlistIcon" class="playlistIcon"
:class="{ playlistIconActive: reversePlaylist }" :class="{ playlistIconActive: reversePlaylist }"
icon="exchange-alt" :icon="['fas', 'exchange-alt']"
:title="$t('Video.Reverse Playlist')" :title="$t('Video.Reverse Playlist')"
@click="toggleReversePlaylist" @click="toggleReversePlaylist"
/> />
<font-awesome-icon <font-awesome-icon
class="playlistIcon" class="playlistIcon"
icon="step-backward" :icon="['fas', 'step-backward']"
:title="$t('Video.Play Previous Video')" :title="$t('Video.Play Previous Video')"
@click="playPreviousVideo" @click="playPreviousVideo"
/> />
<font-awesome-icon <font-awesome-icon
class="playlistIcon" class="playlistIcon"
icon="step-forward" :icon="['fas', 'step-forward']"
:title="$t('Video.Play Next Video')" :title="$t('Video.Play Next Video')"
@click="playNextVideo" @click="playNextVideo"
/> />
@ -77,7 +77,7 @@
<font-awesome-icon <font-awesome-icon
v-if="currentVideoIndex === (index + 1)" v-if="currentVideoIndex === (index + 1)"
class="videoIndexIcon" class="videoIndexIcon"
icon="play" :icon="['fas', 'play']"
/> />
<p <p
v-else v-else

View File

@ -5,7 +5,55 @@ import router from './router/index'
import store from './store/index' import store from './store/index'
import i18n from './i18n/index' import i18n from './i18n/index'
import { library } from '@fortawesome/fontawesome-svg-core' import { library } from '@fortawesome/fontawesome-svg-core'
import { fas } from '@fortawesome/free-solid-svg-icons' import {
faAngleDown,
faArrowDown,
faArrowLeft,
faArrowRight,
faBars,
faBookmark,
faCheck,
faClone,
faCommentDots,
faCopy,
faDownload,
faEllipsisH,
faEllipsisV,
faEnvelope,
faExchangeAlt,
faExclamationCircle,
faExternalLinkAlt,
faFileDownload,
faFileVideo,
faFilter,
faFire,
faGlobe,
faHeart,
faHistory,
faInfoCircle,
faLanguage,
faList,
faNewspaper,
faPlay,
faQuestionCircle,
faRandom,
faRetweet,
faRss,
faSatelliteDish,
faSearch,
faShareAlt,
faSlidersH,
faSortDown,
faStar,
faStepBackward,
faStepForward,
faSync,
faThumbsUp,
faThumbtack,
faTimes,
faTimesCircle,
faUsers
} from '@fortawesome/free-solid-svg-icons'
import { faGithub } from '@fortawesome/free-brands-svg-icons/faGithub' import { faGithub } from '@fortawesome/free-brands-svg-icons/faGithub'
import { faBitcoin } from '@fortawesome/free-brands-svg-icons/faBitcoin' import { faBitcoin } from '@fortawesome/free-brands-svg-icons/faBitcoin'
import { faMonero } from '@fortawesome/free-brands-svg-icons/faMonero' import { faMonero } from '@fortawesome/free-brands-svg-icons/faMonero'
@ -18,7 +66,62 @@ Vue.config.devtools = isDev
Vue.config.performance = isDev Vue.config.performance = isDev
Vue.config.productionTip = isDev Vue.config.productionTip = isDev
library.add(fas, faGithub, faBitcoin, faMonero, faMastodon) library.add(
// solid icons
faAngleDown,
faArrowDown,
faArrowLeft,
faArrowRight,
faBars,
faBookmark,
faCheck,
faClone,
faCommentDots,
faCopy,
faDownload,
faEllipsisH,
faEllipsisV,
faEnvelope,
faExchangeAlt,
faExclamationCircle,
faExternalLinkAlt,
faFileDownload,
faFileVideo,
faFilter,
faFire,
faGlobe,
faHeart,
faHistory,
faInfoCircle,
faLanguage,
faList,
faNewspaper,
faPlay,
faQuestionCircle,
faRandom,
faRetweet,
faRss,
faSatelliteDish,
faSearch,
faShareAlt,
faSlidersH,
faSortDown,
faStar,
faStepBackward,
faStepForward,
faSync,
faThumbsUp,
faThumbtack,
faTimes,
faTimesCircle,
faUsers,
// brand icons
faGithub,
faBitcoin,
faMastodon,
faMonero
)
Vue.component('FontAwesomeIcon', FontAwesomeIcon) Vue.component('FontAwesomeIcon', FontAwesomeIcon)

View File

@ -22,32 +22,32 @@ export default Vue.extend({
content: `<a href="https://github.com/FreeTubeApp/FreeTube">GitHub: FreeTubeApp/FreeTube</a><br>${this.$t('About.Licensed under the AGPLv3')} <a href="https://www.gnu.org/licenses/agpl-3.0.en.html">${this.$t('About.View License')}</a>` content: `<a href="https://github.com/FreeTubeApp/FreeTube">GitHub: FreeTubeApp/FreeTube</a><br>${this.$t('About.Licensed under the AGPLv3')} <a href="https://www.gnu.org/licenses/agpl-3.0.en.html">${this.$t('About.View License')}</a>`
}, },
{ {
icon: 'file-download', icon: ['fas', 'file-download'],
title: this.$t('About.Downloads / Changelog'), title: this.$t('About.Downloads / Changelog'),
content: `<a href="https://github.com/FreeTubeApp/FreeTube/releases">${this.$t('About.GitHub releases')}</a>` content: `<a href="https://github.com/FreeTubeApp/FreeTube/releases">${this.$t('About.GitHub releases')}</a>`
}, },
{ {
icon: 'question-circle', icon: ['fas', 'question-circle'],
title: this.$t('About.Help'), title: this.$t('About.Help'),
content: `<a href="https://docs.freetubeapp.io/">${this.$t('About.FreeTube Wiki')}</a> / <a href="https://docs.freetubeapp.io/faq/">${this.$t('About.FAQ')}</a>` content: `<a href="https://docs.freetubeapp.io/">${this.$t('About.FreeTube Wiki')}</a> / <a href="https://docs.freetubeapp.io/faq/">${this.$t('About.FAQ')}</a>`
}, },
{ {
icon: 'exclamation-circle', icon: ['fas', 'exclamation-circle'],
title: this.$t('About.Report a problem'), title: this.$t('About.Report a problem'),
content: `<a href="https://github.com/FreeTubeApp/FreeTube/issues">${this.$t('About.GitHub issues')}</a><br>${this.$t('About.Please check for duplicates before posting')}` content: `<a href="https://github.com/FreeTubeApp/FreeTube/issues">${this.$t('About.GitHub issues')}</a><br>${this.$t('About.Please check for duplicates before posting')}`
}, },
{ {
icon: 'globe', icon: ['fas', 'globe'],
title: this.$t('About.Website'), title: this.$t('About.Website'),
content: '<a href="https://freetubeapp.io/">https://freetubeapp.io/</a>' content: '<a href="https://freetubeapp.io/">https://freetubeapp.io/</a>'
}, },
{ {
icon: 'newspaper', icon: ['fas', 'newspaper'],
title: this.$t('About.Blog'), title: this.$t('About.Blog'),
content: '<a href="https://blog.freetubeapp.io">https://blog.freetubeapp.io</a>' content: '<a href="https://blog.freetubeapp.io">https://blog.freetubeapp.io</a>'
}, },
{ {
icon: 'envelope', icon: ['fas', 'envelope'],
title: this.$t('About.Email'), title: this.$t('About.Email'),
content: '<a href="mailto:FreeTubeApp@protonmail.com">FreeTubeApp@protonmail.com</a>' content: '<a href="mailto:FreeTubeApp@protonmail.com">FreeTubeApp@protonmail.com</a>'
}, },
@ -57,22 +57,22 @@ export default Vue.extend({
content: '<a href="https://mastodon.technology/@FreeTube">@FreeTube@mastodon.technology</a>' content: '<a href="https://mastodon.technology/@FreeTube">@FreeTube@mastodon.technology</a>'
}, },
{ {
icon: 'comment-dots', icon: ['fas', 'comment-dots'],
title: this.$t('About.Chat on Matrix'), title: this.$t('About.Chat on Matrix'),
content: `<a href="https://matrix.to/#/#freetube:matrix.org?via=matrix.org&via=privacytools.io&via=tchncs.de">#freetube:matrix.org</a><br>${this.$t('About.Please read the')} <a href="https://docs.freetubeapp.io/community/matrix/">${this.$t('About.room rules')}</a>` content: `<a href="https://matrix.to/#/#freetube:matrix.org?via=matrix.org&via=privacytools.io&via=tchncs.de">#freetube:matrix.org</a><br>${this.$t('About.Please read the')} <a href="https://docs.freetubeapp.io/community/matrix/">${this.$t('About.room rules')}</a>`
}, },
{ {
icon: 'language', icon: ['fas', 'language'],
title: this.$t('About.Translate'), title: this.$t('About.Translate'),
content: '<a href="https://hosted.weblate.org/engage/free-tube/">https://hosted.weblate.org/engage/free-tube/</a>' content: '<a href="https://hosted.weblate.org/engage/free-tube/">https://hosted.weblate.org/engage/free-tube/</a>'
}, },
{ {
icon: 'users', icon: ['fas', 'users'],
title: this.$t('About.Credits'), title: this.$t('About.Credits'),
content: `${this.$t('About.FreeTube is made possible by')} <a href="https://docs.freetubeapp.io/credits/">${this.$t('About.these people and projects')}</a>` content: `${this.$t('About.FreeTube is made possible by')} <a href="https://docs.freetubeapp.io/credits/">${this.$t('About.these people and projects')}</a>`
}, },
{ {
icon: 'heart', icon: ['fas', 'heart'],
title: `${this.$t('About.Donate')} - Liberapay`, title: `${this.$t('About.Donate')} - Liberapay`,
content: '<a href="https://liberapay.com/FreeTube">https://liberapay.com/FreeTube</a>' content: '<a href="https://liberapay.com/FreeTube">https://liberapay.com/FreeTube</a>'
}, },

View File

@ -192,7 +192,7 @@
class="getNextPage" class="getNextPage"
@click="handleFetchMore" @click="handleFetchMore"
> >
<font-awesome-icon icon="search" /> {{ $t("Search Filters.Fetch more results") }} <font-awesome-icon :icon="['fas', 'search']" /> {{ $t("Search Filters.Fetch more results") }}
</div> </div>
</div> </div>
</ft-card> </ft-card>

View File

@ -15,7 +15,7 @@
</ft-card> </ft-card>
<ft-icon-button <ft-icon-button
v-if="!isLoading" v-if="!isLoading"
icon="sync" :icon="['fas', 'sync']"
class="floatingTopButton" class="floatingTopButton"
:size="12" :size="12"
theme="primary" theme="primary"

View File

@ -18,7 +18,7 @@
class="getNextPage" class="getNextPage"
@click="nextPage" @click="nextPage"
> >
<font-awesome-icon icon="search" /> {{ $t("Search Filters.Fetch more results") }} <font-awesome-icon :icon="['fas', 'search']" /> {{ $t("Search Filters.Fetch more results") }}
</div> </div>
</ft-card> </ft-card>
</div> </div>

View File

@ -48,7 +48,7 @@
</ft-card> </ft-card>
<ft-icon-button <ft-icon-button
v-if="!isLoading" v-if="!isLoading"
icon="sync" :icon="['fas', 'sync']"
class="floatingTopButton" class="floatingTopButton"
:title="$t('Subscriptions.Refresh Subscriptions')" :title="$t('Subscriptions.Refresh Subscriptions')"
:size="12" :size="12"

View File

@ -75,7 +75,7 @@
</ft-card> </ft-card>
<ft-icon-button <ft-icon-button
v-if="!isLoading" v-if="!isLoading"
icon="sync" :icon="['fas', 'sync']"
class="floatingTopButton" class="floatingTopButton"
:size="12" :size="12"
theme="primary" theme="primary"

View File

@ -47,7 +47,7 @@
class="premiereDate" class="premiereDate"
> >
<font-awesome-icon <font-awesome-icon
icon="satellite-dish" :icon="['fas', 'satellite-dish']"
class="premiereIcon" class="premiereIcon"
/> />
<p <p