diff --git a/.editorconfig b/.editorconfig
index aaac3258..c6c8b362 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -1,7 +1,8 @@
root = true
[*]
-indent_style = tab
+indent_style = space
+indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 00000000..a9ba028c
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1 @@
+.eslintrc.js
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 00000000..976dfccc
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,56 @@
+module.exports = {
+ extends: [
+ 'eslint:recommended',
+ 'plugin:import/recommended',
+ ],
+ plugins: ['import'],
+ parserOptions: {
+ ecmaVersion: 'latest',
+ },
+ rules: {
+ 'arrow-parens': ['error', 'always'],
+ 'object-curly-spacing': ['error', 'always'],
+ 'import/first': 'error',
+ 'import/newline-after-import': 'error',
+ 'import/no-default-export': 'off',
+ 'import/no-duplicates': 'error',
+ 'import/order': [
+ 'error',
+ {
+ 'groups': ['builtin', 'external', ['internal', 'index', 'sibling'], 'parent', 'type'],
+ 'newlines-between': 'always-and-inside-groups',
+ 'alphabetize': {order: 'ignore', caseInsensitive: false}
+ }
+ ],
+ 'import/prefer-default-export': 'off',
+ 'camelcase': ['error', {properties: 'never'}],
+ 'class-methods-use-this': 'off',
+ 'lines-around-comment': [
+ 'error',
+ {
+ beforeBlockComment: false,
+ afterBlockComment: false,
+ beforeLineComment: false,
+ afterLineComment: false,
+ },
+ ],
+ 'max-len': 'off',
+ 'no-mixed-operators': 'error',
+ 'no-multi-spaces': ['error', {ignoreEOLComments: true}],
+ 'no-tabs': 'error',
+ 'no-void': 'error',
+ 'no-empty': 'off',
+ 'prefer-promise-reject-errors': 'off',
+ 'quotes': ['error', 'single', {
+ avoidEscape: true,
+ allowTemplateLiterals: false,
+ }],
+ 'quote-props': ['error', 'consistent'],
+ },
+ env: {
+ browser: true,
+ node: true,
+ es6: true,
+ },
+ ignorePatterns: ['dist', 'node_modules'],
+};
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 962b4adb..dcd9cd72 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -15,7 +15,7 @@ jobs:
strategy:
fail-fast: true
matrix:
- os: [macos-latest, ubuntu-latest, windows-latest]
+ os: [ macos-latest, ubuntu-latest, windows-latest ]
steps:
- uses: actions/checkout@v3
diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml
index 05661a91..bac08e6c 100644
--- a/.github/workflows/dependency-review.yml
+++ b/.github/workflows/dependency-review.yml
@@ -5,7 +5,7 @@
# Source repository: https://github.com/actions/dependency-review-action
# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement
name: "Dependency Review"
-on: [pull_request]
+on: [ pull_request ]
permissions:
contents: read
diff --git a/.github/workflows/winget-submission.yml b/.github/workflows/winget-submission.yml
index 89d5e4c1..3d729e98 100644
--- a/.github/workflows/winget-submission.yml
+++ b/.github/workflows/winget-submission.yml
@@ -2,7 +2,7 @@ name: Submit to Windows Package Manager Community Repository
on:
release:
- types: [released]
+ types: [ released ]
workflow_dispatch:
inputs:
tag_name:
diff --git a/changelog.md b/changelog.md
index 64025651..55d2ecce 100644
--- a/changelog.md
+++ b/changelog.md
@@ -23,22 +23,29 @@ All notable changes to this project will be documented in this file. Dates are d
- Allow downloading age restricted videos [`#1086`](https://github.com/th-ch/youtube-music/pull/1086)
- add starting page option [`#1073`](https://github.com/th-ch/youtube-music/pull/1073)
- [downloader] plugin overhaul [`#1054`](https://github.com/th-ch/youtube-music/pull/1054)
-- [Snyk] Upgrade @cliqz/adblocker-electron from 1.25.2 to 1.26.0 [`#1070`](https://github.com/th-ch/youtube-music/pull/1070)
-- [in-app-menu] fix css style of the library of uploaded songs [`#1072`](https://github.com/th-ch/youtube-music/pull/1072)
+- [Snyk] Upgrade @cliqz/adblocker-electron from 1.25.2 to
+ 1.26.0 [`#1070`](https://github.com/th-ch/youtube-music/pull/1070)
+- [in-app-menu] fix css style of the library of uploaded
+ songs [`#1072`](https://github.com/th-ch/youtube-music/pull/1072)
- add option to hide the like buttons [`#1077`](https://github.com/th-ch/youtube-music/pull/1077)
- Nitpick: Fix name casing in tray icon tooltip [`#1081`](https://github.com/th-ch/youtube-music/pull/1081)
-- [lyrics-genius] Improved reliability of east asian language detection #1080 [`#1082`](https://github.com/th-ch/youtube-music/pull/1082)
+- [lyrics-genius] Improved reliability of east asian language detection
+ #1080 [`#1082`](https://github.com/th-ch/youtube-music/pull/1082)
- Add dynamic synced plugin config provider [`#1064`](https://github.com/th-ch/youtube-music/pull/1064)
-- [captions-selector] fix button showing when there aren't any captions available [`#1063`](https://github.com/th-ch/youtube-music/pull/1063)
+- [captions-selector] fix button showing when there aren't any captions
+ available [`#1063`](https://github.com/th-ch/youtube-music/pull/1063)
- [in-app-menu] fix items hidden by navbar in library [`#1067`](https://github.com/th-ch/youtube-music/pull/1067)
- Fix Youtube Music logo is draggable [`#1061`](https://github.com/th-ch/youtube-music/pull/1061)
-- fix build action failing on forks, and run it on pull requests [`#1069`](https://github.com/th-ch/youtube-music/pull/1069)
+- fix build action failing on forks, and run it on pull
+ requests [`#1069`](https://github.com/th-ch/youtube-music/pull/1069)
- try to fix songInfo time&album [`#1032`](https://github.com/th-ch/youtube-music/pull/1032)
- [lyrics] Romanization toggle for Genius plugin [`#1039`](https://github.com/th-ch/youtube-music/pull/1039)
- [Snyk] Upgrade html-to-text from 9.0.3 to 9.0.4 [`#1056`](https://github.com/th-ch/youtube-music/pull/1056)
- [in-app-menu] add toggle menu icon [`#988`](https://github.com/th-ch/youtube-music/pull/988)
-- Fix playback speed slider not showing and PiP button showing when it shouldn't [`#1048`](https://github.com/th-ch/youtube-music/pull/1048)
-- [lyrics-genius] Fix lyrics not showing up or showing up when they shouldn't [`#1052`](https://github.com/th-ch/youtube-music/pull/1052)
+- Fix playback speed slider not showing and PiP button showing when it
+ shouldn't [`#1048`](https://github.com/th-ch/youtube-music/pull/1048)
+- [lyrics-genius] Fix lyrics not showing up or showing up when they
+ shouldn't [`#1052`](https://github.com/th-ch/youtube-music/pull/1052)
- [in-app-menu] disable nav-bar drag when menu is open [`#1055`](https://github.com/th-ch/youtube-music/pull/1055)
- [Notifications] [Windows] Native interactive notifications [`#946`](https://github.com/th-ch/youtube-music/pull/946)
- automate winget releases [`#1049`](https://github.com/th-ch/youtube-music/pull/1049)
@@ -66,7 +73,8 @@ All notable changes to this project will be documented in this file. Dates are d
- fix SnoreToast implementation [`#941`](https://github.com/th-ch/youtube-music/pull/941)
- Bump json5 from 1.0.1 to 1.0.2 [`#942`](https://github.com/th-ch/youtube-music/pull/942)
- [Snyk] Upgrade custom-electron-titlebar from 4.1.3 to 4.1.5 [`#969`](https://github.com/th-ch/youtube-music/pull/969)
-- Fixed video-toggle aligning running before #main-panel exists [`#956`](https://github.com/th-ch/youtube-music/pull/956)
+- Fixed video-toggle aligning running before #main-panel
+ exists [`#956`](https://github.com/th-ch/youtube-music/pull/956)
- [New plugin] Music visualizers [`#953`](https://github.com/th-ch/youtube-music/pull/953)
- fix PiP buttons not showing up [`#964`](https://github.com/th-ch/youtube-music/pull/964)
- Use same audio context/source everywhere [`#951`](https://github.com/th-ch/youtube-music/pull/951)
@@ -78,7 +86,8 @@ All notable changes to this project will be documented in this file. Dates are d
- fix unescaped url params [`#1050`](https://github.com/th-ch/youtube-music/issues/1050)
- fix playback speed selector [`#1045`](https://github.com/th-ch/youtube-music/issues/1045)
- fix PiP button [`#959`](https://github.com/th-ch/youtube-music/issues/959)
-- fix security issues in deps [`9cde19d`](https://github.com/th-ch/youtube-music/commit/9cde19d906081fe1851f90fa44581b2b74c328e3)
+- fix security issues in
+ deps [`9cde19d`](https://github.com/th-ch/youtube-music/commit/9cde19d906081fe1851f90fa44581b2b74c328e3)
- rome lint [`325026e`](https://github.com/th-ch/youtube-music/commit/325026e3eae3daed33a6d66d1ef9f898d6805b28)
- lint [`b652a01`](https://github.com/th-ch/youtube-music/commit/b652a011a5a08978db6660aeca6908c47a7cf07a)
@@ -91,25 +100,32 @@ All notable changes to this project will be documented in this file. Dates are d
- Load plugins as soon as the window is created [`#890`](https://github.com/th-ch/youtube-music/pull/890)
- Bump qs from 6.5.2 to 6.5.3 [`#913`](https://github.com/th-ch/youtube-music/pull/913)
- [Snyk] Upgrade custom-electron-titlebar from 4.1.1 to 4.1.2 [`#900`](https://github.com/th-ch/youtube-music/pull/900)
-- Add option in skip-silences plugin to only skip at the beginning [`#931`](https://github.com/th-ch/youtube-music/pull/931)
+- Add option in skip-silences plugin to only skip at the
+ beginning [`#931`](https://github.com/th-ch/youtube-music/pull/931)
- Replace rimraf by del-cli [`#932`](https://github.com/th-ch/youtube-music/pull/932)
- docs: Added winget install instructions [`#873`](https://github.com/th-ch/youtube-music/pull/873)
- [Snyk] Upgrade async-mutex from 0.3.2 to 0.4.0 [`#855`](https://github.com/th-ch/youtube-music/pull/855)
-- [Snyk] Upgrade @cliqz/adblocker-electron from 1.25.0 to 1.25.1 [`#856`](https://github.com/th-ch/youtube-music/pull/856)
+- [Snyk] Upgrade @cliqz/adblocker-electron from 1.25.0 to
+ 1.25.1 [`#856`](https://github.com/th-ch/youtube-music/pull/856)
- [Snyk] Upgrade custom-electron-titlebar from 4.1.0 to 4.1.1 [`#865`](https://github.com/th-ch/youtube-music/pull/865)
- [Snyk] Upgrade @ffmpeg/ffmpeg from 0.11.5 to 0.11.6 [`#876`](https://github.com/th-ch/youtube-music/pull/876)
- Discord Plugin RPC Fix [`#888`](https://github.com/th-ch/youtube-music/pull/888)
- Bump FFMpeg [`#854`](https://github.com/th-ch/youtube-music/pull/854)
-- [Snyk] Upgrade @cliqz/adblocker-electron from 1.23.8 to 1.23.9 [`#823`](https://github.com/th-ch/youtube-music/pull/823)
+- [Snyk] Upgrade @cliqz/adblocker-electron from 1.23.8 to
+ 1.23.9 [`#823`](https://github.com/th-ch/youtube-music/pull/823)
- [Snyk] Upgrade electron-store from 8.0.2 to 8.1.0 [`#801`](https://github.com/th-ch/youtube-music/pull/801)
-- proposal: Adding an option to hide duration before the song ends [`#802`](https://github.com/th-ch/youtube-music/pull/802)
+- proposal: Adding an option to hide duration before the song
+ ends [`#802`](https://github.com/th-ch/youtube-music/pull/802)
- [Snyk] Security upgrade node-fetch from 2.6.7 to 3.2.10 [`#790`](https://github.com/th-ch/youtube-music/pull/790)
- Update README.md with a new theme repo [`#807`](https://github.com/th-ch/youtube-music/pull/807)
- Fix likes on touchbar (they were inverted) [`#822`](https://github.com/th-ch/youtube-music/pull/822)
- Add Scoop install directions for Windows 🪟 [`#839`](https://github.com/th-ch/youtube-music/pull/839)
-- Bump version and change release type when publishing a new version [`31ab27c`](https://github.com/th-ch/youtube-music/commit/31ab27c39ff6319116a6514d952eed1f02dd45fd)
-- Lock node-fetch to v2 for commonJS [`c9f610f`](https://github.com/th-ch/youtube-music/commit/c9f610f7fcfcce1317338364045ab0e1bf4249a4)
-- fix: upgrade @cliqz/adblocker-electron from 1.25.0 to 1.25.1 [`762ef4e`](https://github.com/th-ch/youtube-music/commit/762ef4eede29b53aae912b3b50a1ca53f6765c53)
+- Bump version and change release type when publishing a new
+ version [`31ab27c`](https://github.com/th-ch/youtube-music/commit/31ab27c39ff6319116a6514d952eed1f02dd45fd)
+- Lock node-fetch to v2 for
+ commonJS [`c9f610f`](https://github.com/th-ch/youtube-music/commit/c9f610f7fcfcce1317338364045ab0e1bf4249a4)
+- fix: upgrade @cliqz/adblocker-electron from 1.25.0 to
+ 1.25.1 [`762ef4e`](https://github.com/th-ch/youtube-music/commit/762ef4eede29b53aae912b3b50a1ca53f6765c53)
#### [v1.18.0](https://github.com/th-ch/youtube-music/compare/v1.17.0...v1.18.0)
@@ -122,7 +138,8 @@ All notable changes to this project will be documented in this file. Dates are d
- [Snyk] Upgrade electron-store from 8.0.1 to 8.0.2 [`#772`](https://github.com/th-ch/youtube-music/pull/772)
- Bump jpeg-js from 0.4.3 to 0.4.4 [`#756`](https://github.com/th-ch/youtube-music/pull/756)
- Support MPRIS loop and volume change [`#749`](https://github.com/th-ch/youtube-music/pull/749)
-- [Snyk] Upgrade @cliqz/adblocker-electron from 1.23.7 to 1.23.8 [`#742`](https://github.com/th-ch/youtube-music/pull/742)
+- [Snyk] Upgrade @cliqz/adblocker-electron from 1.23.7 to
+ 1.23.8 [`#742`](https://github.com/th-ch/youtube-music/pull/742)
- Use ; instead of space for play/pause. [`#745`](https://github.com/th-ch/youtube-music/pull/745)
- Update readme.md [`#750`](https://github.com/th-ch/youtube-music/pull/750)
- fix lyrics font size [`#753`](https://github.com/th-ch/youtube-music/pull/753)
@@ -132,7 +149,8 @@ All notable changes to this project will be documented in this file. Dates are d
- Picture in Picture v2 [`#685`](https://github.com/th-ch/youtube-music/pull/685)
- Add MPRIS volume control [`#776`](https://github.com/th-ch/youtube-music/issues/776)
- Remove jest [`bb6115f`](https://github.com/th-ch/youtube-music/commit/bb6115fec1a18a416edb365a442eb0b0ee330768)
-- migrate from remote to ipc [`5bd9768`](https://github.com/th-ch/youtube-music/commit/5bd97685b9e07c656e0b57a9e02819afc70af1b1)
+- migrate from remote to
+ ipc [`5bd9768`](https://github.com/th-ch/youtube-music/commit/5bd97685b9e07c656e0b57a9e02819afc70af1b1)
- v3 [`d23bfe9`](https://github.com/th-ch/youtube-music/commit/d23bfe936840b947ca101fd304464f65d36e88cc)
#### [v1.17.0](https://github.com/th-ch/youtube-music/compare/v1.16.0...v1.17.0)
@@ -141,7 +159,8 @@ All notable changes to this project will be documented in this file. Dates are d
- Bump ejs from 3.1.6 to 3.1.7 [`#712`](https://github.com/th-ch/youtube-music/pull/712)
- fix injectCSS `did-finish-load` listener overload [`#693`](https://github.com/th-ch/youtube-music/pull/693)
-- [Snyk] Upgrade @cliqz/adblocker-electron from 1.23.6 to 1.23.7 [`#689`](https://github.com/th-ch/youtube-music/pull/689)
+- [Snyk] Upgrade @cliqz/adblocker-electron from 1.23.6 to
+ 1.23.7 [`#689`](https://github.com/th-ch/youtube-music/pull/689)
- [Snyk] Upgrade custom-electron-prompt from 1.4.1 to 1.4.2 [`#686`](https://github.com/th-ch/youtube-music/pull/686)
- [Snyk] Upgrade @electron/remote from 2.0.7 to 2.0.8 [`#684`](https://github.com/th-ch/youtube-music/pull/684)
- Improve plugin submenu ux [`#699`](https://github.com/th-ch/youtube-music/pull/699)
@@ -154,21 +173,27 @@ All notable changes to this project will be documented in this file. Dates are d
- Add plugin to bypass age restrictions [`#682`](https://github.com/th-ch/youtube-music/pull/682)
- Add "Picture in picture" plugin [`#674`](https://github.com/th-ch/youtube-music/pull/674)
- Set lyrics metadata from Genius [`#679`](https://github.com/th-ch/youtube-music/pull/679)
-- MacOS: bring back the app in dock when using tray + app hidden [`#677`](https://github.com/th-ch/youtube-music/pull/677)
+- MacOS: bring back the app in dock when using tray + app
+ hidden [`#677`](https://github.com/th-ch/youtube-music/pull/677)
- [Snyk] Upgrade @electron/remote from 2.0.4 to 2.0.5 [`#644`](https://github.com/th-ch/youtube-music/pull/644)
- [Snyk] Upgrade ytpl from 2.2.3 to 2.3.0 [`#660`](https://github.com/th-ch/youtube-music/pull/660)
- [Snyk] Upgrade ytdl-core from 4.10.1 to 4.11.0 [`#659`](https://github.com/th-ch/youtube-music/pull/659)
- Bump plist from 3.0.2 to 3.0.5 [`#678`](https://github.com/th-ch/youtube-music/pull/678)
-- [Snyk] Upgrade @cliqz/adblocker-electron from 1.23.4 to 1.23.5 [`#624`](https://github.com/th-ch/youtube-music/pull/624)
+- [Snyk] Upgrade @cliqz/adblocker-electron from 1.23.4 to
+ 1.23.5 [`#624`](https://github.com/th-ch/youtube-music/pull/624)
- [Precise-Volume] fix volumeHud position in miniplayer [`#645`](https://github.com/th-ch/youtube-music/pull/645)
- add always-on-top option [`#655`](https://github.com/th-ch/youtube-music/pull/655)
-- [precise-volume] fix expand-volume-slider not updating its value [`#670`](https://github.com/th-ch/youtube-music/pull/670)
+- [precise-volume] fix expand-volume-slider not updating its
+ value [`#670`](https://github.com/th-ch/youtube-music/pull/670)
- Fix lyrics genius missing parts [`#671`](https://github.com/th-ch/youtube-music/pull/671)
- feat: option to force show like buttons [`#673`](https://github.com/th-ch/youtube-music/pull/673)
- fix custom titlebar in prompt options [`#619`](https://github.com/th-ch/youtube-music/pull/619)
-- Process lyrics HTML in Genius util [`d0532d6`](https://github.com/th-ch/youtube-music/commit/d0532d691e56f955ef0b41f5fe2efe6295dddf9e)
-- Create first version of picture in picture plugin [`d2265b5`](https://github.com/th-ch/youtube-music/commit/d2265b59d78143cf51fe4dc3d5dee9da66873cc1)
-- Bump electron-builder to fix Mac build script [`ae8365f`](https://github.com/th-ch/youtube-music/commit/ae8365f721eafda6c502d02eee86d098f2b9e2a1)
+- Process lyrics HTML in Genius
+ util [`d0532d6`](https://github.com/th-ch/youtube-music/commit/d0532d691e56f955ef0b41f5fe2efe6295dddf9e)
+- Create first version of picture in picture
+ plugin [`d2265b5`](https://github.com/th-ch/youtube-music/commit/d2265b59d78143cf51fe4dc3d5dee9da66873cc1)
+- Bump electron-builder to fix Mac build
+ script [`ae8365f`](https://github.com/th-ch/youtube-music/commit/ae8365f721eafda6c502d02eee86d098f2b9e2a1)
#### [v1.16.0](https://github.com/th-ch/youtube-music/compare/v1.15.0...v1.16.0)
@@ -177,7 +202,8 @@ All notable changes to this project will be documented in this file. Dates are d
- update in-app-menu [`#596`](https://github.com/th-ch/youtube-music/pull/596)
- Fix clientID [`#602`](https://github.com/th-ch/youtube-music/pull/602)
- Add snoretoast custom compile script [`#600`](https://github.com/th-ch/youtube-music/pull/600)
-- fix interactive notifications icon + exclude platform specific plugins from build [`#591`](https://github.com/th-ch/youtube-music/pull/591)
+- fix interactive notifications icon + exclude platform specific plugins from
+ build [`#591`](https://github.com/th-ch/youtube-music/pull/591)
- Add album title to largeImage and change paused icon [`#587`](https://github.com/th-ch/youtube-music/pull/587)
- make useragent override optional [`#595`](https://github.com/th-ch/youtube-music/pull/595)
- get album name from DOM [`#588`](https://github.com/th-ch/youtube-music/pull/588)
@@ -192,7 +218,8 @@ All notable changes to this project will be documented in this file. Dates are d
- fix precise-volume hud positioning [`#567`](https://github.com/th-ch/youtube-music/pull/567)
- update electron and dependencies [`#565`](https://github.com/th-ch/youtube-music/pull/565)
- filenamify playlist folder name [`#557`](https://github.com/th-ch/youtube-music/pull/557)
-- [Snyk] Security upgrade node-fetch from 2.6.6 to 2.6.7 (3.1.1 incompatible) [`#554`](https://github.com/th-ch/youtube-music/pull/554)
+- [Snyk] Security upgrade node-fetch from 2.6.6 to 2.6.7 (3.1.1
+ incompatible) [`#554`](https://github.com/th-ch/youtube-music/pull/554)
- fix app starting offscreen [`#548`](https://github.com/th-ch/youtube-music/pull/548)
- Release Mac arm64 [`#566`](https://github.com/th-ch/youtube-music/pull/566)
- Build command for Apple (m1) silicon macs [`#553`](https://github.com/th-ch/youtube-music/pull/553)
@@ -202,17 +229,24 @@ All notable changes to this project will be documented in this file. Dates are d
- allow downloading playlists from popup menu [`#549`](https://github.com/th-ch/youtube-music/pull/549)
- xesam:artist should be a list [`#539`](https://github.com/th-ch/youtube-music/pull/539)
- fix notifications showing thumbnail of last song [`#537`](https://github.com/th-ch/youtube-music/pull/537)
-- Fix https://github.com/th-ch/youtube-music/pull/578#issuecomment-1035517531 [`#578`](https://github.com/th-ch/youtube-music/pull/578)
-- Add automatic changelog [`1d9bfe8`](https://github.com/th-ch/youtube-music/commit/1d9bfe8ac8869cde648164979986964baa52c2f9)
-- update electron to v17.0.0 [`fef7115`](https://github.com/th-ch/youtube-music/commit/fef711549fa9862f8ea23301edde747c5802e352)
-- update dependencies [`8be07bc`](https://github.com/th-ch/youtube-music/commit/8be07bcb7ad8b727d97c36aa0760aed4e2fc481f)
+-
+
+Fix https://github.com/th-ch/youtube-music/pull/578#issuecomment-1035517531 [`#578`](https://github.com/th-ch/youtube-music/pull/578)
+
+- Add automatic
+ changelog [`1d9bfe8`](https://github.com/th-ch/youtube-music/commit/1d9bfe8ac8869cde648164979986964baa52c2f9)
+- update electron to
+ v17.0.0 [`fef7115`](https://github.com/th-ch/youtube-music/commit/fef711549fa9862f8ea23301edde747c5802e352)
+- update
+ dependencies [`8be07bc`](https://github.com/th-ch/youtube-music/commit/8be07bcb7ad8b727d97c36aa0760aed4e2fc481f)
#### [v1.15.0](https://github.com/th-ch/youtube-music/compare/v1.14.0...v1.15.0)
> 30 December 2021
- Switch from spectron to playwright to fix tests [`#531`](https://github.com/th-ch/youtube-music/pull/531)
-- [Snyk] Upgrade @cliqz/adblocker-electron from 1.23.0 to 1.23.1 [`#529`](https://github.com/th-ch/youtube-music/pull/529)
+- [Snyk] Upgrade @cliqz/adblocker-electron from 1.23.0 to
+ 1.23.1 [`#529`](https://github.com/th-ch/youtube-music/pull/529)
- fix precise-volume options sync [`#525`](https://github.com/th-ch/youtube-music/pull/525)
- Add album art/thumbnail to discord activity [`#524`](https://github.com/th-ch/youtube-music/pull/524)
- fix skip-silences plugin [`#521`](https://github.com/th-ch/youtube-music/pull/521)
@@ -222,19 +256,23 @@ All notable changes to this project will be documented in this file. Dates are d
- Add "Skip silences" plugin [`#519`](https://github.com/th-ch/youtube-music/pull/519)
- Aligned lyric design [`#510`](https://github.com/th-ch/youtube-music/pull/510)
- Fix mpris bugs - follows #480 [`#509`](https://github.com/th-ch/youtube-music/pull/509)
-- Various small fixes (discord, video-toggle, precise-volume, playback-speed, shortcuts, lyrics) [`#476`](https://github.com/th-ch/youtube-music/pull/476)
+- Various small fixes (discord, video-toggle, precise-volume, playback-speed, shortcuts,
+ lyrics) [`#476`](https://github.com/th-ch/youtube-music/pull/476)
- Mpris + obs-tuna fixes [`#480`](https://github.com/th-ch/youtube-music/pull/480)
- [Snyk] Upgrade node-fetch from 2.6.5 to 2.6.6 [`#498`](https://github.com/th-ch/youtube-music/pull/498)
- fix interaction between blur navbar & in-app-menu [`#491`](https://github.com/th-ch/youtube-music/pull/491)
-- [Snyk] Upgrade @cliqz/adblocker-electron from 1.22.7 to 1.23.0 [`#475`](https://github.com/th-ch/youtube-music/pull/475)
+- [Snyk] Upgrade @cliqz/adblocker-electron from 1.22.7 to
+ 1.23.0 [`#475`](https://github.com/th-ch/youtube-music/pull/475)
- New Plugin: Exponential Volume [`#488`](https://github.com/th-ch/youtube-music/pull/488)
- [Snyk] Upgrade electron-updater from 4.6.0 to 4.6.1 [`#474`](https://github.com/th-ch/youtube-music/pull/474)
-- Fix loadeddata/metadata video events rarely not firing (+other small fixes) [`#477`](https://github.com/th-ch/youtube-music/pull/477)
+- Fix loadeddata/metadata video events rarely not firing (+other small
+ fixes) [`#477`](https://github.com/th-ch/youtube-music/pull/477)
- fix #490 [`#490`](https://github.com/th-ch/youtube-music/issues/490)
- fix #472 [`#472`](https://github.com/th-ch/youtube-music/issues/472)
- fix mpris [`ccfe743`](https://github.com/th-ch/youtube-music/commit/ccfe7434bf708ee58156c2952234a049706edfc2)
- lint [`4362101`](https://github.com/th-ch/youtube-music/commit/4362101c0a2ebb7f0536f615cecba8a55ac96702)
-- rework songInfo pause listener [`6726e26`](https://github.com/th-ch/youtube-music/commit/6726e2600b3ca3a8d68e3e1b95b50da211fa354d)
+- rework songInfo pause
+ listener [`6726e26`](https://github.com/th-ch/youtube-music/commit/6726e2600b3ca3a8d68e3e1b95b50da211fa354d)
#### [v1.14.0](https://github.com/th-ch/youtube-music/compare/v1.13.0...v1.14.0)
@@ -255,50 +293,60 @@ All notable changes to this project will be documented in this file. Dates are d
- Discord plugin: Clean Up Export (follow-up #380) [`#440`](https://github.com/th-ch/youtube-music/pull/440)
- remove upgrade button + makes images unselectable [`#434`](https://github.com/th-ch/youtube-music/pull/434)
- new auto confirm when paused [`#433`](https://github.com/th-ch/youtube-music/pull/433)
-- fix: mpris instance not registering itself and media controls [`#431`](https://github.com/th-ch/youtube-music/pull/431)
+- fix: mpris instance not registering itself and media
+ controls [`#431`](https://github.com/th-ch/youtube-music/pull/431)
- Audio compressor plugin [`#288`](https://github.com/th-ch/youtube-music/pull/288)
- precise-volume plugin fixes & updates [`#275`](https://github.com/th-ch/youtube-music/pull/275)
- Custom Prompt for changing options [`#243`](https://github.com/th-ch/youtube-music/pull/243)
- [Snyk] Upgrade async-mutex from 0.3.1 to 0.3.2 [`#412`](https://github.com/th-ch/youtube-music/pull/412)
- build(deps): bump tmpl from 1.0.4 to 1.0.5 [`#414`](https://github.com/th-ch/youtube-music/pull/414)
- [Snyk] Upgrade node-fetch from 2.6.1 to 2.6.2 [`#416`](https://github.com/th-ch/youtube-music/pull/416)
-- [Snyk] Upgrade @cliqz/adblocker-electron from 1.22.5 to 1.22.6 [`#429`](https://github.com/th-ch/youtube-music/pull/429)
+- [Snyk] Upgrade @cliqz/adblocker-electron from 1.22.5 to
+ 1.22.6 [`#429`](https://github.com/th-ch/youtube-music/pull/429)
- build(deps-dev): bump electron from 12.0.8 to 12.1.0 [`#430`](https://github.com/th-ch/youtube-music/pull/430)
- Fix discord clearActivity, menu, listen along option [`#380`](https://github.com/th-ch/youtube-music/pull/380)
- Bump dev deps [`41a01ba`](https://github.com/th-ch/youtube-music/commit/41a01ba58a17056ba5143fdbd10d3bae11dd8d52)
-- Discord add reconnecting functionality [`b5fd6b4`](https://github.com/th-ch/youtube-music/commit/b5fd6b4969a318b3738583e7f33eb2c0cf295237)
-- add custom-electron-prompt [`e4eed2e`](https://github.com/th-ch/youtube-music/commit/e4eed2e51979378e62dab902e425218cae5108dc)
+- Discord add reconnecting
+ functionality [`b5fd6b4`](https://github.com/th-ch/youtube-music/commit/b5fd6b4969a318b3738583e7f33eb2c0cf295237)
+- add
+ custom-electron-prompt [`e4eed2e`](https://github.com/th-ch/youtube-music/commit/e4eed2e51979378e62dab902e425218cae5108dc)
#### [v1.13.0](https://github.com/th-ch/youtube-music/compare/v1.12.2...v1.13.0)
> 19 September 2021
-- [Snyk] Upgrade @cliqz/adblocker-electron from 1.22.4 to 1.22.5 [`#406`](https://github.com/th-ch/youtube-music/pull/406)
-- Fix incorrect Google alert caused by changing user agent coresponding to current platform [`#384`](https://github.com/th-ch/youtube-music/pull/384)
+- [Snyk] Upgrade @cliqz/adblocker-electron from 1.22.4 to
+ 1.22.5 [`#406`](https://github.com/th-ch/youtube-music/pull/406)
+- Fix incorrect Google alert caused by changing user agent coresponding to current
+ platform [`#384`](https://github.com/th-ch/youtube-music/pull/384)
- [Snyk] Upgrade electron-updater from 4.4.3 to 4.4.6 [`#401`](https://github.com/th-ch/youtube-music/pull/401)
- [Snyk] Upgrade electron-updater from 4.4.0 to 4.4.1 [`#370`](https://github.com/th-ch/youtube-music/pull/370)
- Bump path-parse from 1.0.6 to 1.0.7 [`#375`](https://github.com/th-ch/youtube-music/pull/375)
-- [Snyk] Upgrade @cliqz/adblocker-electron from 1.22.2 to 1.22.3 [`#385`](https://github.com/th-ch/youtube-music/pull/385)
+- [Snyk] Upgrade @cliqz/adblocker-electron from 1.22.2 to
+ 1.22.3 [`#385`](https://github.com/th-ch/youtube-music/pull/385)
- Bump jszip from 3.5.0 to 3.7.1 [`#388`](https://github.com/th-ch/youtube-music/pull/388)
- List missing plugins [`#382`](https://github.com/th-ch/youtube-music/pull/382)
- add tuna plugin for obs [`#397`](https://github.com/th-ch/youtube-music/pull/397)
- Update menu buttons to new format [`#389`](https://github.com/th-ch/youtube-music/pull/389)
- Plugin to fetch lyrics from Genius [`#387`](https://github.com/th-ch/youtube-music/pull/387)
-- Add mpris support with cherry picked commit from previous PR https://github.com/th-ch/youtube-music/pull/394 [`#395`](https://github.com/th-ch/youtube-music/pull/395)
+- Add mpris support with cherry picked commit from previous
+ PR https://github.com/th-ch/youtube-music/pull/394 [`#395`](https://github.com/th-ch/youtube-music/pull/395)
- Add "Listen Along" button, solve #353 [`#383`](https://github.com/th-ch/youtube-music/pull/383)
- Bump node to v14 [`#386`](https://github.com/th-ch/youtube-music/pull/386)
- [Snyk] Upgrade electron-updater from 4.3.9 to 4.3.10 [`#350`](https://github.com/th-ch/youtube-music/pull/350)
- [Snyk] Upgrade chokidar from 3.5.1 to 3.5.2 [`#354`](https://github.com/th-ch/youtube-music/pull/354)
- Bump ytdl/ytpl [`c01506d`](https://github.com/th-ch/youtube-music/commit/c01506dc441bfc538471dc2c552c1a8a2800c611)
- Add mpris support [`e255777`](https://github.com/th-ch/youtube-music/commit/e255777283c7b16611404cbfe260bfcca75a1e40)
-- Add Genius lyrics plugin [`acbe0ac`](https://github.com/th-ch/youtube-music/commit/acbe0ac25d568c25fedb514e0e96c66497b0f2d6)
+- Add Genius lyrics
+ plugin [`acbe0ac`](https://github.com/th-ch/youtube-music/commit/acbe0ac25d568c25fedb514e0e96c66497b0f2d6)
#### [v1.12.2](https://github.com/th-ch/youtube-music/compare/v1.12.1...v1.12.2)
> 1 July 2021
- Fix downloader plugin [`#339`](https://github.com/th-ch/youtube-music/pull/339)
-- [Snyk] Upgrade @cliqz/adblocker-electron from 1.22.0 to 1.22.1 [`#337`](https://github.com/th-ch/youtube-music/pull/337)
+- [Snyk] Upgrade @cliqz/adblocker-electron from 1.22.0 to
+ 1.22.1 [`#337`](https://github.com/th-ch/youtube-music/pull/337)
- Update and simplify in-app-menu [`#249`](https://github.com/th-ch/youtube-music/pull/249)
- Bump hosted-git-info from 2.8.8 to 2.8.9 [`#331`](https://github.com/th-ch/youtube-music/pull/331)
- Bump lodash from 4.17.20 to 4.17.21 [`#330`](https://github.com/th-ch/youtube-music/pull/330)
@@ -309,12 +357,16 @@ All notable changes to this project will be documented in this file. Dates are d
- [Snyk] Upgrade @ffmpeg/core from 0.9.0 to 0.10.0 [`#317`](https://github.com/th-ch/youtube-music/pull/317)
- [Snyk] Upgrade @ffmpeg/ffmpeg from 0.9.8 to 0.10.0 [`#316`](https://github.com/th-ch/youtube-music/pull/316)
- [Snyk] Upgrade custom-electron-titlebar from 3.2.6 to 3.2.7 [`#311`](https://github.com/th-ch/youtube-music/pull/311)
-- fix hidden webp thumbnail throwing MIME type error in downloader [`#318`](https://github.com/th-ch/youtube-music/pull/318)
+- fix hidden webp thumbnail throwing MIME type error in
+ downloader [`#318`](https://github.com/th-ch/youtube-music/pull/318)
- Add Sponsorblock plugin [`#308`](https://github.com/th-ch/youtube-music/pull/308)
- [Snyk] Upgrade @ffmpeg/ffmpeg from 0.9.7 to 0.9.8 [`#305`](https://github.com/th-ch/youtube-music/pull/305)
-- Bump dependencies to fix vulnerabilities [`496836b`](https://github.com/th-ch/youtube-music/commit/496836b33b116e06b8d1361ce1f47ab6c9138cae)
-- update refreshMenu() function [`33855f1`](https://github.com/th-ch/youtube-music/commit/33855f17dd80c099117a3d84bbd9b5021776771c)
-- Add SponsorBlock plugin [`ca64a77`](https://github.com/th-ch/youtube-music/commit/ca64a77ed0236fd9cfb4b40e450578a186638dc7)
+- Bump dependencies to fix
+ vulnerabilities [`496836b`](https://github.com/th-ch/youtube-music/commit/496836b33b116e06b8d1361ce1f47ab6c9138cae)
+- update refreshMenu()
+ function [`33855f1`](https://github.com/th-ch/youtube-music/commit/33855f17dd80c099117a3d84bbd9b5021776771c)
+- Add SponsorBlock
+ plugin [`ca64a77`](https://github.com/th-ch/youtube-music/commit/ca64a77ed0236fd9cfb4b40e450578a186638dc7)
#### [v1.12.1](https://github.com/th-ch/youtube-music/compare/v1.12.0...v1.12.1)
@@ -322,13 +374,15 @@ All notable changes to this project will be documented in this file. Dates are d
- Bump ws from 7.4.3 to 7.4.6 [`#303`](https://github.com/th-ch/youtube-music/pull/303)
- Bump browserslist from 4.16.3 to 4.16.6 [`#301`](https://github.com/th-ch/youtube-music/pull/301)
-- [Snyk] Upgrade @cliqz/adblocker-electron from 1.20.4 to 1.20.5 [`#300`](https://github.com/th-ch/youtube-music/pull/300)
+- [Snyk] Upgrade @cliqz/adblocker-electron from 1.20.4 to
+ 1.20.5 [`#300`](https://github.com/th-ch/youtube-music/pull/300)
- [Snyk] Upgrade ytdl-core from 4.5.0 to 4.7.0 [`#299`](https://github.com/th-ch/youtube-music/pull/299)
- [Snyk] Upgrade @ffmpeg/core from 0.8.5 to 0.9.0 [`#298`](https://github.com/th-ch/youtube-music/pull/298)
- [Snyk] Upgrade filenamify from 4.2.0 to 4.3.0 [`#293`](https://github.com/th-ch/youtube-music/pull/293)
- [Snyk] Upgrade ytpl from 2.1.1 to 2.2.0 [`#285`](https://github.com/th-ch/youtube-music/pull/285)
- fix song-info callback duplication [`#269`](https://github.com/th-ch/youtube-music/pull/269)
-- fix notification showing appID instead of app name on windows [`#270`](https://github.com/th-ch/youtube-music/pull/270)
+- fix notification showing appID instead of app name on
+ windows [`#270`](https://github.com/th-ch/youtube-music/pull/270)
- Upgrade electron to v12 [`#273`](https://github.com/th-ch/youtube-music/pull/273)
- fix last-fm overwrite config on each start [`#267`](https://github.com/th-ch/youtube-music/pull/267)
- Downloader tweaks + taskbar progress bar [`#265`](https://github.com/th-ch/youtube-music/pull/265)
@@ -338,9 +392,12 @@ All notable changes to this project will be documented in this file. Dates are d
- Bump ua-parser-js from 0.7.23 to 0.7.28 [`#260`](https://github.com/th-ch/youtube-music/pull/260)
- Fix precise volume listener override [`#253`](https://github.com/th-ch/youtube-music/pull/253)
- fix css not inserting on reload [`#255`](https://github.com/th-ch/youtube-music/pull/255)
-- playlist download progressBar using `chokidar` [`53bf7c5`](https://github.com/th-ch/youtube-music/commit/53bf7c5068fdc14f5aa469d47b3174d27f40e05c)
-- download progress bar on taskbar [`a8ac2c3`](https://github.com/th-ch/youtube-music/commit/a8ac2c3af988f299be85010e7fea541096b7e261)
-- fix: upgrade @cliqz/adblocker-electron from 1.20.4 to 1.20.5 [`c5f84b5`](https://github.com/th-ch/youtube-music/commit/c5f84b568b0c3480af1abc8ff111771e2170a50e)
+- playlist download progressBar
+ using `chokidar` [`53bf7c5`](https://github.com/th-ch/youtube-music/commit/53bf7c5068fdc14f5aa469d47b3174d27f40e05c)
+- download progress bar on
+ taskbar [`a8ac2c3`](https://github.com/th-ch/youtube-music/commit/a8ac2c3af988f299be85010e7fea541096b7e261)
+- fix: upgrade @cliqz/adblocker-electron from 1.20.4 to
+ 1.20.5 [`c5f84b5`](https://github.com/th-ch/youtube-music/commit/c5f84b568b0c3480af1abc8ff111771e2170a50e)
#### [v1.12.0](https://github.com/th-ch/youtube-music/compare/v1.11.0...v1.12.0)
@@ -350,7 +407,8 @@ All notable changes to this project will be documented in this file. Dates are d
- Interactive notifications for windows [`#228`](https://github.com/th-ch/youtube-music/pull/228)
- [Plugin] Precise volume control [`#236`](https://github.com/th-ch/youtube-music/pull/236)
- [Snyk] Upgrade electron-store from 7.0.2 to 7.0.3 [`#244`](https://github.com/th-ch/youtube-music/pull/244)
-- [Snyk] Upgrade @cliqz/adblocker-electron from 1.20.3 to 1.20.4 [`#233`](https://github.com/th-ch/youtube-music/pull/233)
+- [Snyk] Upgrade @cliqz/adblocker-electron from 1.20.3 to
+ 1.20.4 [`#233`](https://github.com/th-ch/youtube-music/pull/233)
- Dependencies update [`#231`](https://github.com/th-ch/youtube-music/pull/231)
- Fix downloader metadata [`#245`](https://github.com/th-ch/youtube-music/pull/245)
- Last.fm support [`#196`](https://github.com/th-ch/youtube-music/pull/196)
@@ -365,40 +423,53 @@ All notable changes to this project will be documented in this file. Dates are d
- [Plugin] styled-bars [`#201`](https://github.com/th-ch/youtube-music/pull/201)
- Add configurable notification urgency [`#212`](https://github.com/th-ch/youtube-music/pull/212)
- add Download Folder Chooser [`#207`](https://github.com/th-ch/youtube-music/pull/207)
-- Improved songinfo provider, by using the data from the '/player' request [`#194`](https://github.com/th-ch/youtube-music/pull/194)
+- Improved songinfo provider, by using the data from the '/player'
+ request [`#194`](https://github.com/th-ch/youtube-music/pull/194)
- Download plugin directory chooser [`#10`](https://github.com/th-ch/youtube-music/pull/10)
-- [Snyk] Upgrade @cliqz/adblocker-electron from 1.20.0 to 1.20.1 [`#180`](https://github.com/th-ch/youtube-music/pull/180)
+- [Snyk] Upgrade @cliqz/adblocker-electron from 1.20.0 to
+ 1.20.1 [`#180`](https://github.com/th-ch/youtube-music/pull/180)
- [Plugin] taskbar-mediacontrol (for Windows) [`#200`](https://github.com/th-ch/youtube-music/pull/200)
- merge source [`#3`](https://github.com/th-ch/youtube-music/pull/3)
- merge source [`#2`](https://github.com/th-ch/youtube-music/pull/2)
-- Add playlist feature in downloader plugin + custom menus in plugin system [`#203`](https://github.com/th-ch/youtube-music/pull/203)
+- Add playlist feature in downloader plugin + custom menus in plugin
+ system [`#203`](https://github.com/th-ch/youtube-music/pull/203)
- Added Discord timeout [`#192`](https://github.com/th-ch/youtube-music/pull/192)
-- Override hide(),show(),isVisible from inside plugin [`6427b34`](https://github.com/th-ch/youtube-music/commit/6427b3406c8d84c5b7ecbe6a28158d5dc895c3c2)
-- added back original yarn.lock [`24fea5a`](https://github.com/th-ch/youtube-music/commit/24fea5a24afd4f547628549962d24756cca5e413)
-- remove local prompt [`8dc486f`](https://github.com/th-ch/youtube-music/commit/8dc486f18fe02a218b149838dc7ab939ec1b698a)
+- Override hide(),show(),isVisible from inside
+ plugin [`6427b34`](https://github.com/th-ch/youtube-music/commit/6427b3406c8d84c5b7ecbe6a28158d5dc895c3c2)
+- added back original
+ yarn.lock [`24fea5a`](https://github.com/th-ch/youtube-music/commit/24fea5a24afd4f547628549962d24756cca5e413)
+- remove local
+ prompt [`8dc486f`](https://github.com/th-ch/youtube-music/commit/8dc486f18fe02a218b149838dc7ab939ec1b698a)
#### [v1.11.0](https://github.com/th-ch/youtube-music/compare/v1.10.0...v1.11.0)
> 9 March 2021
- [Snyk] Upgrade electron-store from 7.0.1 to 7.0.2 [`#178`](https://github.com/th-ch/youtube-music/pull/178)
-- Added function to toggle resuming of last song when app starts [`#177`](https://github.com/th-ch/youtube-music/pull/177)
+- Added function to toggle resuming of last song when app
+ starts [`#177`](https://github.com/th-ch/youtube-music/pull/177)
- [Snyk] Upgrade discord-rpc from 3.1.4 to 3.2.0 [`#175`](https://github.com/th-ch/youtube-music/pull/175)
-- [Snyk] Upgrade @cliqz/adblocker-electron from 1.19.0 to 1.20.0 [`#154`](https://github.com/th-ch/youtube-music/pull/154)
-- Added metadata to downloader plugin, and updated packages [`dd1bdae`](https://github.com/th-ch/youtube-music/commit/dd1bdae9478ef831ee2a00b29be04c65626933f8)
-- Fix download/speed menu item [`796a7aa`](https://github.com/th-ch/youtube-music/commit/796a7aaaf1ecaf80b2ef113137f2222499803e29)
-- fix: upgrade @cliqz/adblocker-electron from 1.19.0 to 1.20.0 [`538ab52`](https://github.com/th-ch/youtube-music/commit/538ab52abd46c2e3c6abb529c5137b5286d29670)
+- [Snyk] Upgrade @cliqz/adblocker-electron from 1.19.0 to
+ 1.20.0 [`#154`](https://github.com/th-ch/youtube-music/pull/154)
+- Added metadata to downloader plugin, and updated
+ packages [`dd1bdae`](https://github.com/th-ch/youtube-music/commit/dd1bdae9478ef831ee2a00b29be04c65626933f8)
+- Fix download/speed menu
+ item [`796a7aa`](https://github.com/th-ch/youtube-music/commit/796a7aaaf1ecaf80b2ef113137f2222499803e29)
+- fix: upgrade @cliqz/adblocker-electron from 1.19.0 to
+ 1.20.0 [`538ab52`](https://github.com/th-ch/youtube-music/commit/538ab52abd46c2e3c6abb529c5137b5286d29670)
#### [v1.10.0](https://github.com/th-ch/youtube-music/compare/v1.9.0...v1.10.0)
> 7 February 2021
- [Snyk] Upgrade @ffmpeg/ffmpeg from 0.9.6 to 0.9.7 [`#146`](https://github.com/th-ch/youtube-music/pull/146)
-- Reuse the same notification, instead of creating a new one each time the song changes. [`#144`](https://github.com/th-ch/youtube-music/pull/144)
+- Reuse the same notification, instead of creating a new one each time the song
+ changes. [`#144`](https://github.com/th-ch/youtube-music/pull/144)
- [Snyk] Upgrade ytdl-core from 4.2.1 to 4.3.0 [`#136`](https://github.com/th-ch/youtube-music/pull/136)
- bring the new commits to this fork [`#1`](https://github.com/th-ch/youtube-music/pull/1)
- GH page [`3bcf409`](https://github.com/th-ch/youtube-music/commit/3bcf409f2b1629333714b187c606891cedb12512)
-- Add plugin to control playback speed like in YouTube (from 0.25 to 2) [`f7f3185`](https://github.com/th-ch/youtube-music/commit/f7f31850d3d9879002dc47326e4f6ec9a52c25a1)
+- Add plugin to control playback speed like in YouTube (from 0.25 to
+ 2) [`f7f3185`](https://github.com/th-ch/youtube-music/commit/f7f31850d3d9879002dc47326e4f6ec9a52c25a1)
- Update back.js [`1fdf241`](https://github.com/th-ch/youtube-music/commit/1fdf2416ad414035104bfb51b8450d82e566cb13)
#### [v1.9.0](https://github.com/th-ch/youtube-music/compare/v1.8.2...v1.9.0)
@@ -407,35 +478,47 @@ All notable changes to this project will be documented in this file. Dates are d
- [Snyk] Upgrade electron-debug from 3.1.0 to 3.2.0 [`#121`](https://github.com/th-ch/youtube-music/pull/121)
- Refactor providers [`#125`](https://github.com/th-ch/youtube-music/pull/125)
-- Added Discord rich presence and added extra properties to songInfo provider [`#124`](https://github.com/th-ch/youtube-music/pull/124)
+- Added Discord rich presence and added extra properties to songInfo
+ provider [`#124`](https://github.com/th-ch/youtube-music/pull/124)
- Fix plugins with context isolation [`#127`](https://github.com/th-ch/youtube-music/pull/127)
- Windows portable exe [`#126`](https://github.com/th-ch/youtube-music/pull/126)
-- Split providers in 2 [`0743034`](https://github.com/th-ch/youtube-music/commit/0743034de0443e889ec11d7ea83727ff4fb96599)
-- Added Discord rich presence and added extra properties to songinfo provider [`a8ce87f`](https://github.com/th-ch/youtube-music/commit/a8ce87f2ccb4f0fdbd36676883e6a0497bebc263)
-- Update discord plugin for new provider + wait for ready [`aec542e`](https://github.com/th-ch/youtube-music/commit/aec542e95e2837f54bf19de675f311444789ea4e)
+- Split providers in
+ 2 [`0743034`](https://github.com/th-ch/youtube-music/commit/0743034de0443e889ec11d7ea83727ff4fb96599)
+- Added Discord rich presence and added extra properties to songinfo
+ provider [`a8ce87f`](https://github.com/th-ch/youtube-music/commit/a8ce87f2ccb4f0fdbd36676883e6a0497bebc263)
+- Update discord plugin for new provider + wait for
+ ready [`aec542e`](https://github.com/th-ch/youtube-music/commit/aec542e95e2837f54bf19de675f311444789ea4e)
#### [v1.8.2](https://github.com/th-ch/youtube-music/compare/v1.8.1...v1.8.2)
> 12 January 2021
- Downloader plugin - custom audio format [`#118`](https://github.com/th-ch/youtube-music/pull/118)
-- Globalized the song info and song controls, and updated Touch Bar for it. [`#102`](https://github.com/th-ch/youtube-music/pull/102)
+- Globalized the song info and song controls, and updated Touch Bar for
+ it. [`#102`](https://github.com/th-ch/youtube-music/pull/102)
- Bump electron to v11 [`#120`](https://github.com/th-ch/youtube-music/pull/120)
-- Globalized the songinfo and song controls, and changed the pause/play button. [`9be3e1a`](https://github.com/th-ch/youtube-music/commit/9be3e1afe91f0aa3419040bba65e7b3b83b469c6)
-- Simplifies the notification plugin to use the globalized song info [`5bffdbd`](https://github.com/th-ch/youtube-music/commit/5bffdbd6285a6816749c467d6e912d14748f9959)
-- Loads providers before plugins [`3a5d9bd`](https://github.com/th-ch/youtube-music/commit/3a5d9bd973bdd67e77f8a7687c1430245a9490bd)
+- Globalized the songinfo and song controls, and changed the pause/play
+ button. [`9be3e1a`](https://github.com/th-ch/youtube-music/commit/9be3e1afe91f0aa3419040bba65e7b3b83b469c6)
+- Simplifies the notification plugin to use the globalized song
+ info [`5bffdbd`](https://github.com/th-ch/youtube-music/commit/5bffdbd6285a6816749c467d6e912d14748f9959)
+- Loads providers before
+ plugins [`3a5d9bd`](https://github.com/th-ch/youtube-music/commit/3a5d9bd973bdd67e77f8a7687c1430245a9490bd)
#### [v1.8.1](https://github.com/th-ch/youtube-music/compare/v1.8.0...v1.8.1)
> 8 January 2021
- [Snyk] Upgrade electron-updater from 4.3.5 to 4.3.6 [`#116`](https://github.com/th-ch/youtube-music/pull/116)
-- [Snyk] Upgrade @cliqz/adblocker-electron from 1.18.8 to 1.19.0 [`#117`](https://github.com/th-ch/youtube-music/pull/117)
+- [Snyk] Upgrade @cliqz/adblocker-electron from 1.18.8 to
+ 1.19.0 [`#117`](https://github.com/th-ch/youtube-music/pull/117)
- [Snyk] Upgrade ytdl-core from 4.1.1 to 4.1.2 [`#109`](https://github.com/th-ch/youtube-music/pull/109)
- Bump node-notifier from 8.0.0 to 8.0.1 [`#104`](https://github.com/th-ch/youtube-music/pull/104)
-- fix: upgrade electron-updater from 4.3.5 to 4.3.6 [`0bf77e5`](https://github.com/th-ch/youtube-music/commit/0bf77e592a87eb8a5222cf2c1588488a51044422)
-- fix: upgrade @cliqz/adblocker-electron from 1.18.8 to 1.19.0 [`5c0cc08`](https://github.com/th-ch/youtube-music/commit/5c0cc08d80d60c46e8b27343c6fc302f64fe89e2)
-- fix: upgrade ytdl-core from 4.1.1 to 4.1.2 [`e2cc262`](https://github.com/th-ch/youtube-music/commit/e2cc2628aea653739f878ec2cd2e72e2e70018a1)
+- fix: upgrade electron-updater from 4.3.5 to
+ 4.3.6 [`0bf77e5`](https://github.com/th-ch/youtube-music/commit/0bf77e592a87eb8a5222cf2c1588488a51044422)
+- fix: upgrade @cliqz/adblocker-electron from 1.18.8 to
+ 1.19.0 [`5c0cc08`](https://github.com/th-ch/youtube-music/commit/5c0cc08d80d60c46e8b27343c6fc302f64fe89e2)
+- fix: upgrade ytdl-core from 4.1.1 to
+ 4.1.2 [`e2cc262`](https://github.com/th-ch/youtube-music/commit/e2cc2628aea653739f878ec2cd2e72e2e70018a1)
#### [v1.8.0](https://github.com/th-ch/youtube-music/compare/v1.7.5...v1.8.0)
@@ -446,9 +529,12 @@ All notable changes to this project will be documented in this file. Dates are d
- [Snyk] Upgrade @ffmpeg/ffmpeg from 0.9.5 to 0.9.6 [`#100`](https://github.com/th-ch/youtube-music/pull/100)
- [Readme] Web folder for readme assets + new SVG animation [`#96`](https://github.com/th-ch/youtube-music/pull/96)
- Add new Linux targets (deb, freebsd, rpm) [`#94`](https://github.com/th-ch/youtube-music/pull/94)
-- Web folder for readme assets + new svg animation [`01fc965`](https://github.com/th-ch/youtube-music/commit/01fc9651705f457da63615ff774f00957f783d3d)
-- touchbar plugin - fixed code style [`7473677`](https://github.com/th-ch/youtube-music/commit/7473677477071ca5e7b18bda3193e345d7fd549f)
-- added initial touchbar support [`c3e2c13`](https://github.com/th-ch/youtube-music/commit/c3e2c1380810d156d9d6863fffc804242171bec0)
+- Web folder for readme assets + new svg
+ animation [`01fc965`](https://github.com/th-ch/youtube-music/commit/01fc9651705f457da63615ff774f00957f783d3d)
+- touchbar plugin - fixed code
+ style [`7473677`](https://github.com/th-ch/youtube-music/commit/7473677477071ca5e7b18bda3193e345d7fd549f)
+- added initial touchbar
+ support [`c3e2c13`](https://github.com/th-ch/youtube-music/commit/c3e2c1380810d156d9d6863fffc804242171bec0)
#### [v1.7.5](https://github.com/th-ch/youtube-music/compare/v1.7.4...v1.7.5)
@@ -456,9 +542,12 @@ All notable changes to this project will be documented in this file. Dates are d
- Bump ini from 1.3.5 to 1.3.7 [`#92`](https://github.com/th-ch/youtube-music/pull/92)
- Fix adblocking [`#90`](https://github.com/th-ch/youtube-music/pull/90)
-- Bump adblocker dependency [`49497d0`](https://github.com/th-ch/youtube-music/commit/49497d0efb28ee0be5b16d0f1c3660efafcd289c)
-- Fix adblocker preloading to inject scripts/styles [`66c5ce4`](https://github.com/th-ch/youtube-music/commit/66c5ce46caa85a7ae4ceb3d63a9e168827015c71)
-- Add uBlock Origin filters to default sources [`79c7959`](https://github.com/th-ch/youtube-music/commit/79c795927a3be96456a2f45159285c64166a29b8)
+- Bump adblocker
+ dependency [`49497d0`](https://github.com/th-ch/youtube-music/commit/49497d0efb28ee0be5b16d0f1c3660efafcd289c)
+- Fix adblocker preloading to inject
+ scripts/styles [`66c5ce4`](https://github.com/th-ch/youtube-music/commit/66c5ce46caa85a7ae4ceb3d63a9e168827015c71)
+- Add uBlock Origin filters to default
+ sources [`79c7959`](https://github.com/th-ch/youtube-music/commit/79c795927a3be96456a2f45159285c64166a29b8)
#### [v1.7.4](https://github.com/th-ch/youtube-music/compare/v1.7.3...v1.7.4)
@@ -468,32 +557,41 @@ All notable changes to this project will be documented in this file. Dates are d
> 8 December 2020
-- Adblocker: add option to disable default lists [`22c7f70`](https://github.com/th-ch/youtube-music/commit/22c7f70c938566a9db9c4d46a57224cfdee43df0)
+- Adblocker: add option to disable default
+ lists [`22c7f70`](https://github.com/th-ch/youtube-music/commit/22c7f70c938566a9db9c4d46a57224cfdee43df0)
#### [v1.7.2](https://github.com/th-ch/youtube-music/compare/v1.7.1...v1.7.2)
> 6 December 2020
- Add AUR badge + beautify badges [`#82`](https://github.com/th-ch/youtube-music/pull/82)
-- Bugfix: only use cache with no additional blocklists [`467171a`](https://github.com/th-ch/youtube-music/commit/467171a17e648331d63f166c2da2f3134e95b37f)
-- Add AUR tag + beautify tags [`d212206`](https://github.com/th-ch/youtube-music/commit/d21220693b9ffa26e05fe1963376b636b40b9952)
-- Readme: add youtube-music logo to badges [`3022fac`](https://github.com/th-ch/youtube-music/commit/3022facbead40ccd81629c37b870ab33ce7fa106)
+- Bugfix: only use cache with no additional
+ blocklists [`467171a`](https://github.com/th-ch/youtube-music/commit/467171a17e648331d63f166c2da2f3134e95b37f)
+- Add AUR tag + beautify
+ tags [`d212206`](https://github.com/th-ch/youtube-music/commit/d21220693b9ffa26e05fe1963376b636b40b9952)
+- Readme: add youtube-music logo to
+ badges [`3022fac`](https://github.com/th-ch/youtube-music/commit/3022facbead40ccd81629c37b870ab33ce7fa106)
#### [v1.7.1](https://github.com/th-ch/youtube-music/compare/v1.7.0...v1.7.1)
> 3 December 2020
-- Option to restart the app on config changes [`fd97576`](https://github.com/th-ch/youtube-music/commit/fd97576611ae80b959ffe7984e88ddc8d28a1ffc)
-- Bump version to 1.7.1 [`e07cac2`](https://github.com/th-ch/youtube-music/commit/e07cac240691b1c9d6909e457824616182374c3a)
+- Option to restart the app on config
+ changes [`fd97576`](https://github.com/th-ch/youtube-music/commit/fd97576611ae80b959ffe7984e88ddc8d28a1ffc)
+- Bump version to
+ 1.7.1 [`e07cac2`](https://github.com/th-ch/youtube-music/commit/e07cac240691b1c9d6909e457824616182374c3a)
#### [v1.7.0](https://github.com/th-ch/youtube-music/compare/v1.6.5...v1.7.0)
> 3 December 2020
- Refactor config, custom plugin options [`#79`](https://github.com/th-ch/youtube-music/pull/79)
-- Refactor config for simpler use and advanced options in plugins [`8ab2da0`](https://github.com/th-ch/youtube-music/commit/8ab2da0482b6211b6b6d43423ec06daed48dac4f)
-- Allow editing config (advanced) [`f4fe5c2`](https://github.com/th-ch/youtube-music/commit/f4fe5c2a58e1ad555c321f27c00d2d78184fc687)
-- Adblocker - advanced options (caching or not, additional lists) [`b94d0d4`](https://github.com/th-ch/youtube-music/commit/b94d0d4e8bd3a92bbb5e012a63fa782baa774be7)
+- Refactor config for simpler use and advanced options in
+ plugins [`8ab2da0`](https://github.com/th-ch/youtube-music/commit/8ab2da0482b6211b6b6d43423ec06daed48dac4f)
+- Allow editing config (
+ advanced) [`f4fe5c2`](https://github.com/th-ch/youtube-music/commit/f4fe5c2a58e1ad555c321f27c00d2d78184fc687)
+- Adblocker - advanced options (caching or not, additional
+ lists) [`b94d0d4`](https://github.com/th-ch/youtube-music/commit/b94d0d4e8bd3a92bbb5e012a63fa782baa774be7)
#### [v1.6.5](https://github.com/th-ch/youtube-music/compare/v1.6.4...v1.6.5)
@@ -504,9 +602,12 @@ All notable changes to this project will be documented in this file. Dates are d
- Reflect Arch Linux package name change [`#70`](https://github.com/th-ch/youtube-music/pull/70)
- Option to hide menu [`#67`](https://github.com/th-ch/youtube-music/pull/67)
- Add Arch Linux installation instructions [`#68`](https://github.com/th-ch/youtube-music/pull/68)
-- Update ytdl-core to 4.1.1 [`33a11ef`](https://github.com/th-ch/youtube-music/commit/33a11efe9acad234e41ad9044ae9e67fd573b7f4)
-- Autoupdate modal: add download/disable updates buttons [`ae5b85d`](https://github.com/th-ch/youtube-music/commit/ae5b85d8d748659f2e23d417560026f24ab8ce9c)
-- Option to hide menu (win/linux) [`4bac3ac`](https://github.com/th-ch/youtube-music/commit/4bac3ace186c5be2cb9409d2b703f960bd662145)
+- Update ytdl-core to
+ 4.1.1 [`33a11ef`](https://github.com/th-ch/youtube-music/commit/33a11efe9acad234e41ad9044ae9e67fd573b7f4)
+- Autoupdate modal: add download/disable updates
+ buttons [`ae5b85d`](https://github.com/th-ch/youtube-music/commit/ae5b85d8d748659f2e23d417560026f24ab8ce9c)
+- Option to hide menu (
+ win/linux) [`4bac3ac`](https://github.com/th-ch/youtube-music/commit/4bac3ace186c5be2cb9409d2b703f960bd662145)
#### [v1.6.4](https://github.com/th-ch/youtube-music/compare/v1.6.3...v1.6.4)
@@ -519,9 +620,12 @@ All notable changes to this project will be documented in this file. Dates are d
- Improve CI [`#64`](https://github.com/th-ch/youtube-music/pull/64)
- Ensure menu is visible on all platforms [`#63`](https://github.com/th-ch/youtube-music/pull/63)
- [Snyk] Upgrade @cliqz/adblocker-electron from 1.18.3 to 1.18.4 [`#62`](https://github.com/th-ch/youtube-music/pull/62)
-- fix: upgrade @cliqz/adblocker-electron from 1.18.3 to 1.18.4 [`2b243f6`](https://github.com/th-ch/youtube-music/commit/2b243f6dcb00d3b6f27fd066c093e7b16bb384e2)
-- CI: cache yarn directory [`0fd4933`](https://github.com/th-ch/youtube-music/commit/0fd49330d3218ec5f1bc62b72ace28e79d02bc93)
-- Run CI on every push/PR [`cf4827d`](https://github.com/th-ch/youtube-music/commit/cf4827d780fee510a27eecf42453b0505c52bcf9)
+- fix: upgrade @cliqz/adblocker-electron from 1.18.3 to
+ 1.18.4 [`2b243f6`](https://github.com/th-ch/youtube-music/commit/2b243f6dcb00d3b6f27fd066c093e7b16bb384e2)
+- CI: cache yarn
+ directory [`0fd4933`](https://github.com/th-ch/youtube-music/commit/0fd49330d3218ec5f1bc62b72ace28e79d02bc93)
+- Run CI on every
+ push/PR [`cf4827d`](https://github.com/th-ch/youtube-music/commit/cf4827d780fee510a27eecf42453b0505c52bcf9)
#### [v1.6.2](https://github.com/th-ch/youtube-music/compare/v1.6.0...v1.6.2)
@@ -530,18 +634,24 @@ All notable changes to this project will be documented in this file. Dates are d
- Add github action to build/release [`#60`](https://github.com/th-ch/youtube-music/pull/60)
- Bump to node 12 [`#59`](https://github.com/th-ch/youtube-music/pull/59)
- Bump to node 12 [`#59`](https://github.com/th-ch/youtube-music/pull/59)
-- Add downloader (video -> mp3) plugin (in music menu) [`e197087`](https://github.com/th-ch/youtube-music/commit/e197087a5027af1ca71ecde7bbdf6351137555b9)
-- Delete AppVeyor/Travis CI integration [`941dd90`](https://github.com/th-ch/youtube-music/commit/941dd90d77a5c46ed5505918374693fcd892af1f)
-- GH action to build/release [`fc4754a`](https://github.com/th-ch/youtube-music/commit/fc4754a1709e6eb70d662f89eafd360aa4a77aa2)
+- Add downloader (video -> mp3) plugin (in music
+ menu) [`e197087`](https://github.com/th-ch/youtube-music/commit/e197087a5027af1ca71ecde7bbdf6351137555b9)
+- Delete AppVeyor/Travis CI
+ integration [`941dd90`](https://github.com/th-ch/youtube-music/commit/941dd90d77a5c46ed5505918374693fcd892af1f)
+- GH action to
+ build/release [`fc4754a`](https://github.com/th-ch/youtube-music/commit/fc4754a1709e6eb70d662f89eafd360aa4a77aa2)
#### [v1.6.0](https://github.com/th-ch/youtube-music/compare/v1.5.0...v1.6.0)
> 11 November 2020
- [Snyk] Upgrade electron-store from 6.0.0 to 6.0.1 [`#54`](https://github.com/th-ch/youtube-music/pull/54)
-- Add notifications plugin (notify of song on play event) [`bcff6e5`](https://github.com/th-ch/youtube-music/commit/bcff6e51348645395549c206717225fb16a29cda)
-- Plugins/event handlers in each window [`9bc81da`](https://github.com/th-ch/youtube-music/commit/9bc81da6f2c7f5f35769489e179851bdd80a7da8)
-- Option to toggle devtools [`3e97e93`](https://github.com/th-ch/youtube-music/commit/3e97e9307cf0991adc5584a603c292b03bc6202d)
+- Add notifications plugin (notify of song on play
+ event) [`bcff6e5`](https://github.com/th-ch/youtube-music/commit/bcff6e51348645395549c206717225fb16a29cda)
+- Plugins/event handlers in each
+ window [`9bc81da`](https://github.com/th-ch/youtube-music/commit/9bc81da6f2c7f5f35769489e179851bdd80a7da8)
+- Option to toggle
+ devtools [`3e97e93`](https://github.com/th-ch/youtube-music/commit/3e97e9307cf0991adc5584a603c292b03bc6202d)
#### [v1.5.0](https://github.com/th-ch/youtube-music/compare/v1.4.0...v1.5.0)
@@ -555,8 +665,10 @@ All notable changes to this project will be documented in this file. Dates are d
- Bump lodash from 4.17.15 to 4.17.19 [`#34`](https://github.com/th-ch/youtube-music/pull/34)
- Option to start at login [`#32`](https://github.com/th-ch/youtube-music/pull/32)
- Bump dependencies [`97dce5a`](https://github.com/th-ch/youtube-music/commit/97dce5ad41ba7ff7a12d4e57a6a0acfeccd666d8)
-- Bump electron to v10 (+ remove devtron, bump spectron) [`5f0dcbb`](https://github.com/th-ch/youtube-music/commit/5f0dcbb3fc9b2912bba690db232184d32c599150)
-- Navigation plugin: fix arrow style [`8d74a0a`](https://github.com/th-ch/youtube-music/commit/8d74a0a9b52c5b5a04b0986e5fbec9b47a35823e)
+- Bump electron to v10 (+ remove devtron, bump
+ spectron) [`5f0dcbb`](https://github.com/th-ch/youtube-music/commit/5f0dcbb3fc9b2912bba690db232184d32c599150)
+- Navigation plugin: fix arrow
+ style [`8d74a0a`](https://github.com/th-ch/youtube-music/commit/8d74a0a9b52c5b5a04b0986e5fbec9b47a35823e)
#### [v1.4.0](https://github.com/th-ch/youtube-music/compare/v1.3.3...v1.4.0)
@@ -570,25 +682,33 @@ All notable changes to this project will be documented in this file. Dates are d
- [Snyk] Upgrade electron-updater from 4.3.0 to 4.3.1 [`#26`](https://github.com/th-ch/youtube-music/pull/26)
- [Snyk] Upgrade @cliqz/adblocker-electron from 1.14.1 to 1.14.2 [`#25`](https://github.com/th-ch/youtube-music/pull/25)
- [Tests] Add integration tests [`#24`](https://github.com/th-ch/youtube-music/pull/24)
-- Add jest, spectron and getPort util for tests [`736a706`](https://github.com/th-ch/youtube-music/commit/736a70680108620cdecab2da9dd48e10354c713e)
-- fix: upgrade electron-updater from 4.3.1 to 4.3.2 [`8c94510`](https://github.com/th-ch/youtube-music/commit/8c945100e24187885dbbe5bb7830b1da11e4eaa2)
-- Add jest config and test environment to launch app [`bce5b7d`](https://github.com/th-ch/youtube-music/commit/bce5b7d8ebd96886d462a3c999d72e6c69b6f807)
+- Add jest, spectron and getPort util for
+ tests [`736a706`](https://github.com/th-ch/youtube-music/commit/736a70680108620cdecab2da9dd48e10354c713e)
+- fix: upgrade electron-updater from 4.3.1 to
+ 4.3.2 [`8c94510`](https://github.com/th-ch/youtube-music/commit/8c945100e24187885dbbe5bb7830b1da11e4eaa2)
+- Add jest config and test environment to launch
+ app [`bce5b7d`](https://github.com/th-ch/youtube-music/commit/bce5b7d8ebd96886d462a3c999d72e6c69b6f807)
#### [v1.3.3](https://github.com/th-ch/youtube-music/compare/v1.3.2...v1.3.3)
> 29 April 2020
-- Move tray click callback in setUpTray [`4824dda`](https://github.com/th-ch/youtube-music/commit/4824dda5d52565deb5cd6ef4b51d2d742677a154)
-- Bump version to 1.3.3 [`37cac19`](https://github.com/th-ch/youtube-music/commit/37cac19d9ccae59b89a68b995eaf7e08c7d24d11)
+- Move tray click callback in
+ setUpTray [`4824dda`](https://github.com/th-ch/youtube-music/commit/4824dda5d52565deb5cd6ef4b51d2d742677a154)
+- Bump version to
+ 1.3.3 [`37cac19`](https://github.com/th-ch/youtube-music/commit/37cac19d9ccae59b89a68b995eaf7e08c7d24d11)
#### [v1.3.2](https://github.com/th-ch/youtube-music/compare/v1.3.1...v1.3.2)
> 26 April 2020
- [Snyk] Upgrade electron-updater from 4.2.5 to 4.3.0 [`#22`](https://github.com/th-ch/youtube-music/pull/22)
-- fix: upgrade electron-updater from 4.2.5 to 4.3.0 [`9821300`](https://github.com/th-ch/youtube-music/commit/98213005d09d00bf013d2217809736bdc334ede6)
-- Hide the app (no quit) on close if tray enabled [`430687f`](https://github.com/th-ch/youtube-music/commit/430687f4d6d301aaeaeeaa11ae34d971ac3280df)
-- Show/hide window when clicking on tray [`058371a`](https://github.com/th-ch/youtube-music/commit/058371ace8fbd3d9f126454fdc7dbff86df05506)
+- fix: upgrade electron-updater from 4.2.5 to
+ 4.3.0 [`9821300`](https://github.com/th-ch/youtube-music/commit/98213005d09d00bf013d2217809736bdc334ede6)
+- Hide the app (no quit) on close if tray
+ enabled [`430687f`](https://github.com/th-ch/youtube-music/commit/430687f4d6d301aaeaeeaa11ae34d971ac3280df)
+- Show/hide window when clicking on
+ tray [`058371a`](https://github.com/th-ch/youtube-music/commit/058371ace8fbd3d9f126454fdc7dbff86df05506)
#### [v1.3.1](https://github.com/th-ch/youtube-music/compare/v1.2.0...v1.3.1)
@@ -598,8 +718,10 @@ All notable changes to this project will be documented in this file. Dates are d
- Upgrade outdated dependencies [`#20`](https://github.com/th-ch/youtube-music/pull/20)
- [Plugins] Migrate ad blocker [`#19`](https://github.com/th-ch/youtube-music/pull/19)
- Upgrade xo [`297de08`](https://github.com/th-ch/youtube-music/commit/297de08278c2704b3baf65c455bba72f72acc06f)
-- Bump electron-builder (needed after electron upgrade) [`3d9e59d`](https://github.com/th-ch/youtube-music/commit/3d9e59dc90e0e994e20af55af9134477e68907a5)
-- Migrate from adblock-rs to cliqz [`422c3fc`](https://github.com/th-ch/youtube-music/commit/422c3fc28d83da309a80447dcd5064a4346580e8)
+- Bump electron-builder (needed after electron
+ upgrade) [`3d9e59d`](https://github.com/th-ch/youtube-music/commit/3d9e59dc90e0e994e20af55af9134477e68907a5)
+- Migrate from adblock-rs to
+ cliqz [`422c3fc`](https://github.com/th-ch/youtube-music/commit/422c3fc28d83da309a80447dcd5064a4346580e8)
#### [v1.2.0](https://github.com/th-ch/youtube-music/compare/v1.1.6...v1.2.0)
@@ -610,9 +732,12 @@ All notable changes to this project will be documented in this file. Dates are d
- [Snyk] Upgrade electron-debug from 2.1.0 to 2.2.0 [`#15`](https://github.com/th-ch/youtube-music/pull/15)
- Fix vulnerability [`#16`](https://github.com/th-ch/youtube-music/pull/16)
- Plugin: autoconfirm when paused [`#11`](https://github.com/th-ch/youtube-music/pull/11)
-- Migrate to yarn to install packages without package.json (but keep npm rebuild) [`9371a48`](https://github.com/th-ch/youtube-music/commit/9371a4827e2312258a4f692c18f964155d57ceb8)
-- Bump electron-store to fix a vulnerability [`7050dfc`](https://github.com/th-ch/youtube-music/commit/7050dfca5c6a545dabc334690572d7f88b37e027)
-- Bump electron updater [`f25bb59`](https://github.com/th-ch/youtube-music/commit/f25bb59065d84cde202b5192688847c528c6ef61)
+- Migrate to yarn to install packages without package.json (but keep npm
+ rebuild) [`9371a48`](https://github.com/th-ch/youtube-music/commit/9371a4827e2312258a4f692c18f964155d57ceb8)
+- Bump electron-store to fix a
+ vulnerability [`7050dfc`](https://github.com/th-ch/youtube-music/commit/7050dfca5c6a545dabc334690572d7f88b37e027)
+- Bump electron
+ updater [`f25bb59`](https://github.com/th-ch/youtube-music/commit/f25bb59065d84cde202b5192688847c528c6ef61)
#### [v1.1.6](https://github.com/th-ch/youtube-music/compare/v1.1.5...v1.1.6)
@@ -623,59 +748,78 @@ All notable changes to this project will be documented in this file. Dates are d
- Bump lodash from 4.17.11 to 4.17.14 [`#5`](https://github.com/th-ch/youtube-music/pull/5)
- npm audit fix [`1a72129`](https://github.com/th-ch/youtube-music/commit/1a72129108935cbe732621d93b877e90d11a4195)
- Fix Google login [`746b5f1`](https://github.com/th-ch/youtube-music/commit/746b5f13bb08c614df290e69946cfd116a550521)
-- Bump version to 1.1.6 [`6fd10ea`](https://github.com/th-ch/youtube-music/commit/6fd10ea4a0f63e9a46e7307d811977f4e0f3213f)
+- Bump version to
+ 1.1.6 [`6fd10ea`](https://github.com/th-ch/youtube-music/commit/6fd10ea4a0f63e9a46e7307d811977f4e0f3213f)
#### [v1.1.5](https://github.com/th-ch/youtube-music/compare/v1.1.4...v1.1.5)
> 6 July 2019
-- Fix navigation plugin [`b10a1bb`](https://github.com/th-ch/youtube-music/commit/b10a1bb32dbea187422a43487527c379a9ddbb26)
-- Bump version to 1.1.5 [`07c4a42`](https://github.com/th-ch/youtube-music/commit/07c4a429c15f22b173629618518abb97d9ec0100)
+- Fix navigation
+ plugin [`b10a1bb`](https://github.com/th-ch/youtube-music/commit/b10a1bb32dbea187422a43487527c379a9ddbb26)
+- Bump version to
+ 1.1.5 [`07c4a42`](https://github.com/th-ch/youtube-music/commit/07c4a429c15f22b173629618518abb97d9ec0100)
#### [v1.1.4](https://github.com/th-ch/youtube-music/compare/v1.1.3...v1.1.4)
> 8 June 2019
-- isDev -> is package [`a85325f`](https://github.com/th-ch/youtube-music/commit/a85325f33dbd40517b6029e500569fc1640af2ef)
-- Add titlebar/frame only on MacOS [`b1c4cc9`](https://github.com/th-ch/youtube-music/commit/b1c4cc9c45cc48413118aec8ce54767b1983a3e7)
-- Bump version to 1.1.4 [`0420f2e`](https://github.com/th-ch/youtube-music/commit/0420f2e49e295cede0db22dbb1f35ffafd6318ed)
+- isDev -> is
+ package [`a85325f`](https://github.com/th-ch/youtube-music/commit/a85325f33dbd40517b6029e500569fc1640af2ef)
+- Add titlebar/frame only on
+ MacOS [`b1c4cc9`](https://github.com/th-ch/youtube-music/commit/b1c4cc9c45cc48413118aec8ce54767b1983a3e7)
+- Bump version to
+ 1.1.4 [`0420f2e`](https://github.com/th-ch/youtube-music/commit/0420f2e49e295cede0db22dbb1f35ffafd6318ed)
#### [v1.1.3](https://github.com/th-ch/youtube-music/compare/v1.1.2...v1.1.3)
> 2 June 2019
- Bump fstream from 1.0.11 to 1.0.12 [`#3`](https://github.com/th-ch/youtube-music/pull/3)
-- Version 1.1.3 + npm audit fix [`147ac48`](https://github.com/th-ch/youtube-music/commit/147ac48de6540c836e835fefe47e66e55dbdc9bc)
-- Fix case for {en/dis}ablePlugin [`e86d63d`](https://github.com/th-ch/youtube-music/commit/e86d63da8cb083b89c2a26e6514a5b0df8868b13)
-- Remove outdated download links [`ec58b5c`](https://github.com/th-ch/youtube-music/commit/ec58b5cbedda8d6f881f0e81f185a1707dbe5fab)
+- Version 1.1.3 + npm audit
+ fix [`147ac48`](https://github.com/th-ch/youtube-music/commit/147ac48de6540c836e835fefe47e66e55dbdc9bc)
+- Fix case for
+ {en/dis}ablePlugin [`e86d63d`](https://github.com/th-ch/youtube-music/commit/e86d63da8cb083b89c2a26e6514a5b0df8868b13)
+- Remove outdated download
+ links [`ec58b5c`](https://github.com/th-ch/youtube-music/commit/ec58b5cbedda8d6f881f0e81f185a1707dbe5fab)
#### [v1.1.2](https://github.com/th-ch/youtube-music/compare/v1.1.1...v1.1.2)
> 1 May 2019
-- Display error/retry in case of failure [`5a1d7fb`](https://github.com/th-ch/youtube-music/commit/5a1d7fbf230fcd840a3ea654f31602fb5f504852)
-- Bump version to 1.1.2 [`eac2c5c`](https://github.com/th-ch/youtube-music/commit/eac2c5cf14d0a348704f7fbf0ff0bdce02758670)
+- Display error/retry in case of
+ failure [`5a1d7fb`](https://github.com/th-ch/youtube-music/commit/5a1d7fbf230fcd840a3ea654f31602fb5f504852)
+- Bump version to
+ 1.1.2 [`eac2c5c`](https://github.com/th-ch/youtube-music/commit/eac2c5cf14d0a348704f7fbf0ff0bdce02758670)
#### [v1.1.1](https://github.com/th-ch/youtube-music/compare/v1.1.0...v1.1.1)
> 28 April 2019
-- Update package lock [`2d3f77d`](https://github.com/th-ch/youtube-music/commit/2d3f77d96211460bb81a73c8c62b9e5407a7cf30)
+- Update package
+ lock [`2d3f77d`](https://github.com/th-ch/youtube-music/commit/2d3f77d96211460bb81a73c8c62b9e5407a7cf30)
- Add travis config [`5279a45`](https://github.com/th-ch/youtube-music/commit/5279a45f3537170006ba04cd5d59ac8b879d78a5)
-- Add Appveyor config [`abc2bb8`](https://github.com/th-ch/youtube-music/commit/abc2bb8a4f749704f2daf376c0d392030f030caf)
+- Add Appveyor
+ config [`abc2bb8`](https://github.com/th-ch/youtube-music/commit/abc2bb8a4f749704f2daf376c0d392030f030caf)
#### [v1.1.0](https://github.com/th-ch/youtube-music/compare/v1.0.0...v1.1.0)
> 19 April 2019
-- Build script + check for updates [`b3c24a5`](https://github.com/th-ch/youtube-music/commit/b3c24a521281c352c37d649e8334b581b2a1de4f)
-- Add download section in readme [`828e8d4`](https://github.com/th-ch/youtube-music/commit/828e8d472ca3d76dea71d95a85f8fa726404b8e7)
-- Add release/licence badge in readme [`9d343bf`](https://github.com/th-ch/youtube-music/commit/9d343bf779f2fa830302cc84c484bf4a93a25f36)
+- Build script + check for
+ updates [`b3c24a5`](https://github.com/th-ch/youtube-music/commit/b3c24a521281c352c37d649e8334b581b2a1de4f)
+- Add download section in
+ readme [`828e8d4`](https://github.com/th-ch/youtube-music/commit/828e8d472ca3d76dea71d95a85f8fa726404b8e7)
+- Add release/licence badge in
+ readme [`9d343bf`](https://github.com/th-ch/youtube-music/commit/9d343bf779f2fa830302cc84c484bf4a93a25f36)
#### v1.0.0
> 19 April 2019
-- Initial commit - app + 4 plugins [`8787b5c`](https://github.com/th-ch/youtube-music/commit/8787b5c175d02b52de65f2c559b411d999fa51e4)
-- Fix screenshot shadow + compress image [`c5c128f`](https://github.com/th-ch/youtube-music/commit/c5c128fa0f77c69e9bf12f6ca551315b37c51e84)
-- Missing quote in readme [`4b446ac`](https://github.com/th-ch/youtube-music/commit/4b446ac7c816c660cf369f3b8b6e420f766ee35f)
+- Initial commit - app + 4
+ plugins [`8787b5c`](https://github.com/th-ch/youtube-music/commit/8787b5c175d02b52de65f2c559b411d999fa51e4)
+- Fix screenshot shadow + compress
+ image [`c5c128f`](https://github.com/th-ch/youtube-music/commit/c5c128fa0f77c69e9bf12f6ca551315b37c51e84)
+- Missing quote in
+ readme [`4b446ac`](https://github.com/th-ch/youtube-music/commit/4b446ac7c816c660cf369f3b8b6e420f766ee35f)
diff --git a/config/defaults.js b/config/defaults.js
index 23d49077..a0e07e2b 100644
--- a/config/defaults.js
+++ b/config/defaults.js
@@ -1,184 +1,184 @@
const defaultConfig = {
- "window-size": {
- width: 1100,
- height: 550,
- },
- url: "https://music.youtube.com",
- options: {
- tray: false,
- appVisible: true,
- autoUpdates: true,
- hideMenu: false,
- startAtLogin: false,
- disableHardwareAcceleration: false,
- restartOnConfigChanges: false,
- trayClickPlayPause: false,
- autoResetAppCache: false,
- resumeOnStart: true,
- proxy: "",
- startingPage: "",
- },
- plugins: {
- // Enabled plugins
- navigation: {
- enabled: true,
- },
- adblocker: {
- enabled: true,
- cache: true,
- additionalBlockLists: [], // Additional list of filters, e.g "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters.txt"
- },
- // Disabled plugins
- shortcuts: {
- enabled: false,
- overrideMediaKeys: false,
- },
- downloader: {
- enabled: false,
- ffmpegArgs: [], // e.g. ["-b:a", "192k"] for an audio bitrate of 192kb/s
- downloadFolder: undefined, // Custom download folder (absolute path)
- preset: "mp3",
- },
- "last-fm": {
- enabled: false,
- api_root: "http://ws.audioscrobbler.com/2.0/",
- api_key: "04d76faaac8726e60988e14c105d421a", // api key registered by @semvis123
- secret: "a5d2a36fdf64819290f6982481eaffa2",
- },
- discord: {
- enabled: false,
- autoReconnect: true, // if enabled, will try to reconnect to discord every 5 seconds after disconnecting or failing to connect
- activityTimoutEnabled: true, // if enabled, the discord rich presence gets cleared when music paused after the time specified below
- activityTimoutTime: 10 * 60 * 1000, // 10 minutes
- listenAlong: true, // add a "listen along" button to rich presence
- hideDurationLeft: false, // hides the start and end time of the song to rich presence
- },
- notifications: {
- enabled: false,
- unpauseNotification: false,
- urgency: "normal", //has effect only on Linux
- // the following has effect only on Windows
- interactive: true,
- toastStyle: 1, // see plugins/notifications/utils for more info
- refreshOnPlayPause: false,
- trayControls: true,
- hideButtonText: false
- },
- "precise-volume": {
- enabled: false,
- steps: 1, //percentage of volume to change
- arrowsShortcut: true, //enable ArrowUp + ArrowDown local shortcuts
- globalShortcuts: {
- volumeUp: "",
- volumeDown: ""
- },
- savedVolume: undefined //plugin save volume between session here
- },
- sponsorblock: {
- enabled: false,
- apiURL: "https://sponsor.ajay.app",
- categories: [
- "sponsor",
- "intro",
- "outro",
- "interaction",
- "selfpromo",
- "music_offtopic",
- ],
- },
- "video-toggle": {
- enabled: false,
- mode: "custom",
- forceHide: false,
- },
- "picture-in-picture": {
- "enabled": false,
- "alwaysOnTop": true,
- "savePosition": true,
- "saveSize": false,
- "hotkey": "P"
- },
- "captions-selector": {
- enabled: false,
- disableCaptions: false
- },
- "skip-silences": {
- onlySkipBeginning: false,
- },
- "crossfade": {
- enabled: false,
- fadeInDuration: 1500, // ms
- fadeOutDuration: 5000, // ms
- secondsBeforeEnd: 10, // s
- fadeScaling: "linear", // 'linear', 'logarithmic' or a positive number in dB
- },
- visualizer: {
- enabled: false,
- type: "butterchurn",
- // Config per visualizer
- butterchurn: {
- preset: "martin [shadow harlequins shape code] - fata morgana",
- renderingFrequencyInMs: 500,
- blendTimeInSeconds: 2.7,
- },
- vudio: {
- effect: "lighting",
- accuracy: 128,
- lighting: {
- maxHeight: 160,
- maxSize: 12,
- lineWidth: 1,
- color: "#49f3f7",
- shadowBlur: 2,
- shadowColor: "rgba(244,244,244,.5)",
- fadeSide: true,
- prettify: false,
- horizontalAlign: "center",
- verticalAlign: "middle",
- dottify: true,
- },
- },
- wave: {
- animations: [
- {
- type: "Cubes",
- config: {
- bottom: true,
- count: 30,
- cubeHeight: 5,
- fillColor: { gradient: ["#FAD961", "#F76B1C"] },
- lineColor: "rgba(0,0,0,0)",
- radius: 20,
- },
- },
- {
- type: "Cubes",
- config: {
- top: true,
- count: 12,
- cubeHeight: 5,
- fillColor: { gradient: ["#FAD961", "#F76B1C"] },
- lineColor: "rgba(0,0,0,0)",
- radius: 10,
- },
- },
- {
- type: "Circles",
- config: {
- lineColor: {
- gradient: ["#FAD961", "#FAD961", "#F76B1C"],
- rotate: 90,
- },
- lineWidth: 4,
- diameter: 20,
- count: 10,
- frequencyBand: "base",
- },
- },
- ],
- },
- },
- },
+ 'window-size': {
+ width: 1100,
+ height: 550,
+ },
+ 'url': 'https://music.youtube.com',
+ 'options': {
+ tray: false,
+ appVisible: true,
+ autoUpdates: true,
+ hideMenu: false,
+ startAtLogin: false,
+ disableHardwareAcceleration: false,
+ restartOnConfigChanges: false,
+ trayClickPlayPause: false,
+ autoResetAppCache: false,
+ resumeOnStart: true,
+ proxy: '',
+ startingPage: '',
+ },
+ 'plugins': {
+ // Enabled plugins
+ 'navigation': {
+ enabled: true,
+ },
+ 'adblocker': {
+ enabled: true,
+ cache: true,
+ additionalBlockLists: [], // Additional list of filters, e.g "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters.txt"
+ },
+ // Disabled plugins
+ 'shortcuts': {
+ enabled: false,
+ overrideMediaKeys: false,
+ },
+ 'downloader': {
+ enabled: false,
+ ffmpegArgs: [], // E.g. ["-b:a", "192k"] for an audio bitrate of 192kb/s
+ downloadFolder: undefined, // Custom download folder (absolute path)
+ preset: 'mp3',
+ },
+ 'last-fm': {
+ enabled: false,
+ api_root: 'http://ws.audioscrobbler.com/2.0/',
+ api_key: '04d76faaac8726e60988e14c105d421a', // Api key registered by @semvis123
+ secret: 'a5d2a36fdf64819290f6982481eaffa2',
+ },
+ 'discord': {
+ enabled: false,
+ autoReconnect: true, // If enabled, will try to reconnect to discord every 5 seconds after disconnecting or failing to connect
+ activityTimoutEnabled: true, // If enabled, the discord rich presence gets cleared when music paused after the time specified below
+ activityTimoutTime: 10 * 60 * 1000, // 10 minutes
+ listenAlong: true, // Add a "listen along" button to rich presence
+ hideDurationLeft: false, // Hides the start and end time of the song to rich presence
+ },
+ 'notifications': {
+ enabled: false,
+ unpauseNotification: false,
+ urgency: 'normal', // Has effect only on Linux
+ // the following has effect only on Windows
+ interactive: true,
+ toastStyle: 1, // See plugins/notifications/utils for more info
+ refreshOnPlayPause: false,
+ trayControls: true,
+ hideButtonText: false,
+ },
+ 'precise-volume': {
+ enabled: false,
+ steps: 1, // Percentage of volume to change
+ arrowsShortcut: true, // Enable ArrowUp + ArrowDown local shortcuts
+ globalShortcuts: {
+ volumeUp: '',
+ volumeDown: '',
+ },
+ savedVolume: undefined, // Plugin save volume between session here
+ },
+ 'sponsorblock': {
+ enabled: false,
+ apiURL: 'https://sponsor.ajay.app',
+ categories: [
+ 'sponsor',
+ 'intro',
+ 'outro',
+ 'interaction',
+ 'selfpromo',
+ 'music_offtopic',
+ ],
+ },
+ 'video-toggle': {
+ enabled: false,
+ mode: 'custom',
+ forceHide: false,
+ },
+ 'picture-in-picture': {
+ enabled: false,
+ alwaysOnTop: true,
+ savePosition: true,
+ saveSize: false,
+ hotkey: 'P',
+ },
+ 'captions-selector': {
+ enabled: false,
+ disableCaptions: false,
+ },
+ 'skip-silences': {
+ onlySkipBeginning: false,
+ },
+ 'crossfade': {
+ enabled: false,
+ fadeInDuration: 1500, // Ms
+ fadeOutDuration: 5000, // Ms
+ secondsBeforeEnd: 10, // S
+ fadeScaling: 'linear', // 'linear', 'logarithmic' or a positive number in dB
+ },
+ 'visualizer': {
+ enabled: false,
+ type: 'butterchurn',
+ // Config per visualizer
+ butterchurn: {
+ preset: 'martin [shadow harlequins shape code] - fata morgana',
+ renderingFrequencyInMs: 500,
+ blendTimeInSeconds: 2.7,
+ },
+ vudio: {
+ effect: 'lighting',
+ accuracy: 128,
+ lighting: {
+ maxHeight: 160,
+ maxSize: 12,
+ lineWidth: 1,
+ color: '#49f3f7',
+ shadowBlur: 2,
+ shadowColor: 'rgba(244,244,244,.5)',
+ fadeSide: true,
+ prettify: false,
+ horizontalAlign: 'center',
+ verticalAlign: 'middle',
+ dottify: true,
+ },
+ },
+ wave: {
+ animations: [
+ {
+ type: 'Cubes',
+ config: {
+ bottom: true,
+ count: 30,
+ cubeHeight: 5,
+ fillColor: { gradient: ['#FAD961', '#F76B1C'] },
+ lineColor: 'rgba(0,0,0,0)',
+ radius: 20,
+ },
+ },
+ {
+ type: 'Cubes',
+ config: {
+ top: true,
+ count: 12,
+ cubeHeight: 5,
+ fillColor: { gradient: ['#FAD961', '#F76B1C'] },
+ lineColor: 'rgba(0,0,0,0)',
+ radius: 10,
+ },
+ },
+ {
+ type: 'Circles',
+ config: {
+ lineColor: {
+ gradient: ['#FAD961', '#FAD961', '#F76B1C'],
+ rotate: 90,
+ },
+ lineWidth: 4,
+ diameter: 20,
+ count: 10,
+ frequencyBand: 'base',
+ },
+ },
+ ],
+ },
+ },
+ },
};
module.exports = defaultConfig;
diff --git a/config/dynamic.js b/config/dynamic.js
index a11dbf7a..5e014218 100644
--- a/config/dynamic.js
+++ b/config/dynamic.js
@@ -1,32 +1,33 @@
-const { ipcRenderer, ipcMain } = require("electron");
+const { ipcRenderer, ipcMain } = require('electron');
-const defaultConfig = require("./defaults");
-const { getOptions, setOptions, setMenuOptions } = require("./plugins");
-const { sendToFront } = require("../providers/app-controls");
+const defaultConfig = require('./defaults');
+const { getOptions, setOptions, setMenuOptions } = require('./plugins');
+
+const { sendToFront } = require('../providers/app-controls');
const activePlugins = {};
/**
* [!IMPORTANT!]
* The method is **sync** in the main process and **async** in the renderer process.
*/
-module.exports.getActivePlugins =
- process.type === "renderer"
- ? async () => ipcRenderer.invoke("get-active-plugins")
- : () => activePlugins;
+module.exports.getActivePlugins
+ = process.type === 'renderer'
+ ? async () => ipcRenderer.invoke('get-active-plugins')
+ : () => activePlugins;
-if (process.type === "browser") {
- ipcMain.handle("get-active-plugins", this.getActivePlugins);
+if (process.type === 'browser') {
+ ipcMain.handle('get-active-plugins', this.getActivePlugins);
}
/**
* [!IMPORTANT!]
* The method is **sync** in the main process and **async** in the renderer process.
*/
-module.exports.isActive =
- process.type === "renderer"
- ? async (plugin) =>
- plugin in (await ipcRenderer.invoke("get-active-plugins"))
- : (plugin) => plugin in activePlugins;
+module.exports.isActive
+ = process.type === 'renderer'
+ ? async (plugin) =>
+ plugin in (await ipcRenderer.invoke('get-active-plugins'))
+ : (plugin) => plugin in activePlugins;
/**
* This class is used to create a dynamic synced config for plugins.
@@ -47,159 +48,167 @@ module.exports.isActive =
*
* module.exports = (win, options) => {
* const config = new PluginConfig("plugin-name", {
- * enableFront: true,
- * initialOptions: options,
+ * enableFront: true,
+ * initialOptions: options,
* });
* setupMyPlugin(win, config);
* };
*/
module.exports.PluginConfig = class PluginConfig {
- #name;
- #config;
- #defaultConfig;
- #enableFront;
+ #name;
+ #config;
+ #defaultConfig;
+ #enableFront;
- #subscribers = {};
- #allSubscribers = [];
+ #subscribers = {};
+ #allSubscribers = [];
- constructor(name, { enableFront = false, initialOptions = undefined } = {}) {
- const pluginDefaultConfig = defaultConfig.plugins[name] || {};
- const pluginConfig = initialOptions || getOptions(name) || {};
+ constructor(name, { enableFront = false, initialOptions = undefined } = {}) {
+ const pluginDefaultConfig = defaultConfig.plugins[name] || {};
+ const pluginConfig = initialOptions || getOptions(name) || {};
- this.#name = name;
- this.#enableFront = enableFront;
- this.#defaultConfig = pluginDefaultConfig;
- this.#config = { ...pluginDefaultConfig, ...pluginConfig };
+ this.#name = name;
+ this.#enableFront = enableFront;
+ this.#defaultConfig = pluginDefaultConfig;
+ this.#config = { ...pluginDefaultConfig, ...pluginConfig };
- if (this.#enableFront) {
- this.#setupFront();
- }
+ if (this.#enableFront) {
+ this.#setupFront();
+ }
- activePlugins[name] = this;
- }
+ activePlugins[name] = this;
+ }
- get = (option) => {
- return this.#config[option];
- };
+ get = (option) => this.#config[option];
- set = (option, value) => {
- this.#config[option] = value;
- this.#onChange(option);
- this.#save();
- };
+ set = (option, value) => {
+ this.#config[option] = value;
+ this.#onChange(option);
+ this.#save();
+ };
- toggle = (option) => {
- this.#config[option] = !this.#config[option];
- this.#onChange(option);
- this.#save();
- };
+ toggle = (option) => {
+ this.#config[option] = !this.#config[option];
+ this.#onChange(option);
+ this.#save();
+ };
- getAll = () => {
- return { ...this.#config };
- };
+ getAll = () => ({ ...this.#config });
- setAll = (options) => {
- if (!options || typeof options !== "object")
- throw new Error("Options must be an object.");
+ setAll = (options) => {
+ if (!options || typeof options !== 'object') {
+ throw new Error('Options must be an object.');
+ }
- let changed = false;
- for (const [key, val] of Object.entries(options)) {
- if (this.#config[key] !== val) {
- this.#config[key] = val;
- this.#onChange(key, false);
- changed = true;
- }
- }
- if (changed) this.#allSubscribers.forEach((fn) => fn(this.#config));
- this.#save();
- };
+ let changed = false;
+ for (const [key, value] of Object.entries(options)) {
+ if (this.#config[key] !== value) {
+ this.#config[key] = value;
+ this.#onChange(key, false);
+ changed = true;
+ }
+ }
- getDefaultConfig = () => {
- return this.#defaultConfig;
- };
+ if (changed) {
+ for (const fn of this.#allSubscribers) {
+ fn(this.#config);
+ }
+ }
- /**
- * Use this method to set an option and restart the app if `appConfig.restartOnConfigChange === true`
- *
- * Used for options that require a restart to take effect.
- */
- setAndMaybeRestart = (option, value) => {
- this.#config[option] = value;
- setMenuOptions(this.#name, this.#config);
- this.#onChange(option);
- };
+ this.#save();
+ };
- subscribe = (valueName, fn) => {
- this.#subscribers[valueName] = fn;
- };
+ getDefaultConfig = () => this.#defaultConfig;
- subscribeAll = (fn) => {
- this.#allSubscribers.push(fn);
- };
+ /**
+ * Use this method to set an option and restart the app if `appConfig.restartOnConfigChange === true`
+ *
+ * Used for options that require a restart to take effect.
+ */
+ setAndMaybeRestart = (option, value) => {
+ this.#config[option] = value;
+ setMenuOptions(this.#name, this.#config);
+ this.#onChange(option);
+ };
- /** Called only from back */
- #save() {
- setOptions(this.#name, this.#config);
- }
+ subscribe = (valueName, fn) => {
+ this.#subscribers[valueName] = fn;
+ };
- #onChange(valueName, single = true) {
- this.#subscribers[valueName]?.(this.#config[valueName]);
- if (single) this.#allSubscribers.forEach((fn) => fn(this.#config));
- }
+ subscribeAll = (fn) => {
+ this.#allSubscribers.push(fn);
+ };
- #setupFront() {
- const ignoredMethods = ["subscribe", "subscribeAll"];
+ /** Called only from back */
+ #save() {
+ setOptions(this.#name, this.#config);
+ }
- if (process.type === "renderer") {
- for (const [fnName, fn] of Object.entries(this)) {
- if (typeof fn !== "function" || fn.name in ignoredMethods) return;
- this[fnName] = async (...args) => {
- return await ipcRenderer.invoke(
- `${this.#name}-config-${fnName}`,
- ...args,
- );
- };
+ #onChange(valueName, single = true) {
+ this.#subscribers[valueName]?.(this.#config[valueName]);
+ if (single) {
+ for (const fn of this.#allSubscribers) {
+ fn(this.#config);
+ }
+ }
+ }
- this.subscribe = (valueName, fn) => {
- if (valueName in this.#subscribers) {
- console.error(`Already subscribed to ${valueName}`);
- }
- this.#subscribers[valueName] = fn;
- ipcRenderer.on(
- `${this.#name}-config-changed-${valueName}`,
- (_, value) => {
- fn(value);
- },
- );
- ipcRenderer.send(`${this.#name}-config-subscribe`, valueName);
- };
+ #setupFront() {
+ const ignoredMethods = ['subscribe', 'subscribeAll'];
- this.subscribeAll = (fn) => {
- ipcRenderer.on(`${this.#name}-config-changed`, (_, value) => {
- fn(value);
- });
- ipcRenderer.send(`${this.#name}-config-subscribe-all`);
- };
- }
- } else if (process.type === "browser") {
- for (const [fnName, fn] of Object.entries(this)) {
- if (typeof fn !== "function" || fn.name in ignoredMethods) return;
- ipcMain.handle(`${this.#name}-config-${fnName}`, (_, ...args) => {
- return fn(...args);
- });
- }
+ if (process.type === 'renderer') {
+ for (const [fnName, fn] of Object.entries(this)) {
+ if (typeof fn !== 'function' || fn.name in ignoredMethods) {
+ return;
+ }
- ipcMain.on(`${this.#name}-config-subscribe`, (_, valueName) => {
- this.subscribe(valueName, (value) => {
- sendToFront(`${this.#name}-config-changed-${valueName}`, value);
- });
- });
+ this[fnName] = async (...args) => await ipcRenderer.invoke(
+ `${this.#name}-config-${fnName}`,
+ ...args,
+ );
- ipcMain.on(`${this.#name}-config-subscribe-all`, () => {
- this.subscribeAll((value) => {
- sendToFront(`${this.#name}-config-changed`, value);
- });
- });
- }
- }
+ this.subscribe = (valueName, fn) => {
+ if (valueName in this.#subscribers) {
+ console.error(`Already subscribed to ${valueName}`);
+ }
+
+ this.#subscribers[valueName] = fn;
+ ipcRenderer.on(
+ `${this.#name}-config-changed-${valueName}`,
+ (_, value) => {
+ fn(value);
+ },
+ );
+ ipcRenderer.send(`${this.#name}-config-subscribe`, valueName);
+ };
+
+ this.subscribeAll = (fn) => {
+ ipcRenderer.on(`${this.#name}-config-changed`, (_, value) => {
+ fn(value);
+ });
+ ipcRenderer.send(`${this.#name}-config-subscribe-all`);
+ };
+ }
+ } else if (process.type === 'browser') {
+ for (const [fnName, fn] of Object.entries(this)) {
+ if (typeof fn !== 'function' || fn.name in ignoredMethods) {
+ return;
+ }
+
+ ipcMain.handle(`${this.#name}-config-${fnName}`, (_, ...args) => fn(...args));
+ }
+
+ ipcMain.on(`${this.#name}-config-subscribe`, (_, valueName) => {
+ this.subscribe(valueName, (value) => {
+ sendToFront(`${this.#name}-config-changed-${valueName}`, value);
+ });
+ });
+
+ ipcMain.on(`${this.#name}-config-subscribe-all`, () => {
+ this.subscribeAll((value) => {
+ sendToFront(`${this.#name}-config-changed`, value);
+ });
+ });
+ }
+ }
};
diff --git a/config/index.js b/config/index.js
index cf33369e..b8adb91f 100644
--- a/config/index.js
+++ b/config/index.js
@@ -1,30 +1,31 @@
-const defaultConfig = require("./defaults");
-const plugins = require("./plugins");
-const store = require("./store");
-const { restart } = require("../providers/app-controls");
+const defaultConfig = require('./defaults');
+const plugins = require('./plugins');
+const store = require('./store');
+
+const { restart } = require('../providers/app-controls');
const set = (key, value) => {
- store.set(key, value);
+ store.set(key, value);
};
function setMenuOption(key, value) {
- set(key, value);
- if (store.get("options.restartOnConfigChanges")) restart();
+ set(key, value);
+ if (store.get('options.restartOnConfigChanges')) {
+ restart();
+ }
}
-const get = (key) => {
- return store.get(key);
-};
+const get = (key) => store.get(key);
module.exports = {
- defaultConfig,
- get,
- set,
- setMenuOption,
- edit: () => store.openInEditor(),
- watch: (cb) => {
- store.onDidChange("options", cb);
- store.onDidChange("plugins", cb);
- },
- plugins,
+ defaultConfig,
+ get,
+ set,
+ setMenuOption,
+ edit: () => store.openInEditor(),
+ watch(cb) {
+ store.onDidChange('options', cb);
+ store.onDidChange('plugins', cb);
+ },
+ plugins,
};
diff --git a/config/plugins.js b/config/plugins.js
index b8c00f83..6802ecb4 100644
--- a/config/plugins.js
+++ b/config/plugins.js
@@ -1,53 +1,56 @@
-const store = require("./store");
-const { restart } = require("../providers/app-controls");
+const store = require('./store');
+
+const { restart } = require('../providers/app-controls');
function getEnabled() {
- const plugins = store.get("plugins");
- const enabledPlugins = Object.entries(plugins).filter(([plugin, options]) =>
- isEnabled(plugin)
- );
- return enabledPlugins;
+ const plugins = store.get('plugins');
+ const enabledPlugins = Object.entries(plugins).filter(([plugin, options]) =>
+ isEnabled(plugin),
+ );
+ return enabledPlugins;
}
function isEnabled(plugin) {
- const pluginConfig = store.get("plugins")[plugin];
- return pluginConfig !== undefined && pluginConfig.enabled;
+ const pluginConfig = store.get('plugins')[plugin];
+ return pluginConfig !== undefined && pluginConfig.enabled;
}
function setOptions(plugin, options) {
- const plugins = store.get("plugins");
- store.set("plugins", {
- ...plugins,
- [plugin]: {
- ...plugins[plugin],
- ...options,
- },
- });
+ const plugins = store.get('plugins');
+ store.set('plugins', {
+ ...plugins,
+ [plugin]: {
+ ...plugins[plugin],
+ ...options,
+ },
+ });
}
function setMenuOptions(plugin, options) {
- setOptions(plugin, options);
- if (store.get("options.restartOnConfigChanges")) restart();
+ setOptions(plugin, options);
+ if (store.get('options.restartOnConfigChanges')) {
+ restart();
+ }
}
function getOptions(plugin) {
- return store.get("plugins")[plugin];
+ return store.get('plugins')[plugin];
}
function enable(plugin) {
- setMenuOptions(plugin, { enabled: true });
+ setMenuOptions(plugin, { enabled: true });
}
function disable(plugin) {
- setMenuOptions(plugin, { enabled: false });
+ setMenuOptions(plugin, { enabled: false });
}
module.exports = {
- isEnabled,
- getEnabled,
- enable,
- disable,
- setOptions,
- setMenuOptions,
- getOptions,
+ isEnabled,
+ getEnabled,
+ enable,
+ disable,
+ setOptions,
+ setMenuOptions,
+ getOptions,
};
diff --git a/config/store.js b/config/store.js
index 1ba8ce26..c755b1c2 100644
--- a/config/store.js
+++ b/config/store.js
@@ -1,112 +1,113 @@
-const Store = require("electron-store");
+const Store = require('electron-store');
-const defaults = require("./defaults");
+const defaults = require('./defaults');
const setDefaultPluginOptions = (store, plugin) => {
- if (!store.get(`plugins.${plugin}`)) {
- store.set(`plugins.${plugin}`, defaults.plugins[plugin]);
- }
-}
+ if (!store.get(`plugins.${plugin}`)) {
+ store.set(`plugins.${plugin}`, defaults.plugins[plugin]);
+ }
+};
const migrations = {
- ">=1.20.0": (store) => {
- setDefaultPluginOptions(store, "visualizer");
+ '>=1.20.0'(store) {
+ setDefaultPluginOptions(store, 'visualizer');
- if (store.get("plugins.notifications.toastStyle") === undefined) {
- const pluginOptions = store.get("plugins.notifications") || {};
- store.set("plugins.notifications", {
- ...defaults.plugins.notifications,
- ...pluginOptions,
- });
- }
+ if (store.get('plugins.notifications.toastStyle') === undefined) {
+ const pluginOptions = store.get('plugins.notifications') || {};
+ store.set('plugins.notifications', {
+ ...defaults.plugins.notifications,
+ ...pluginOptions,
+ });
+ }
- if (store.get("options.ForceShowLikeButtons")) {
- store.delete("options.ForceShowLikeButtons");
- store.set("options.likeButtons", 'force');
- }
- },
- ">=1.17.0": (store) => {
- setDefaultPluginOptions(store, "picture-in-picture");
+ if (store.get('options.ForceShowLikeButtons')) {
+ store.delete('options.ForceShowLikeButtons');
+ store.set('options.likeButtons', 'force');
+ }
+ },
+ '>=1.17.0'(store) {
+ setDefaultPluginOptions(store, 'picture-in-picture');
- if (store.get("plugins.video-toggle.mode") === undefined) {
- store.set("plugins.video-toggle.mode", "custom");
- }
- },
- ">=1.14.0": (store) => {
- if (
- typeof store.get("plugins.precise-volume.globalShortcuts") !== "object"
- ) {
- store.set("plugins.precise-volume.globalShortcuts", {});
- }
+ if (store.get('plugins.video-toggle.mode') === undefined) {
+ store.set('plugins.video-toggle.mode', 'custom');
+ }
+ },
+ '>=1.14.0'(store) {
+ if (
+ typeof store.get('plugins.precise-volume.globalShortcuts') !== 'object'
+ ) {
+ store.set('plugins.precise-volume.globalShortcuts', {});
+ }
- if (store.get("plugins.hide-video-player.enabled")) {
- store.delete("plugins.hide-video-player");
- store.set("plugins.video-toggle.enabled", true);
- }
- },
- ">=1.13.0": (store) => {
- if (store.get("plugins.discord.listenAlong") === undefined) {
- store.set("plugins.discord.listenAlong", true);
- }
- },
- ">=1.12.0": (store) => {
- const options = store.get("plugins.shortcuts");
- let updated = false;
- for (const optionType of ["global", "local"]) {
- if (Array.isArray(options[optionType])) {
- const updatedOptions = {};
- for (const optionObject of options[optionType]) {
- if (optionObject.action && optionObject.shortcut) {
- updatedOptions[optionObject.action] = optionObject.shortcut;
- }
- }
+ if (store.get('plugins.hide-video-player.enabled')) {
+ store.delete('plugins.hide-video-player');
+ store.set('plugins.video-toggle.enabled', true);
+ }
+ },
+ '>=1.13.0'(store) {
+ if (store.get('plugins.discord.listenAlong') === undefined) {
+ store.set('plugins.discord.listenAlong', true);
+ }
+ },
+ '>=1.12.0'(store) {
+ const options = store.get('plugins.shortcuts');
+ let updated = false;
+ for (const optionType of ['global', 'local']) {
+ if (Array.isArray(options[optionType])) {
+ const updatedOptions = {};
+ for (const optionObject of options[optionType]) {
+ if (optionObject.action && optionObject.shortcut) {
+ updatedOptions[optionObject.action] = optionObject.shortcut;
+ }
+ }
- options[optionType] = updatedOptions;
- updated = true;
- }
- }
+ options[optionType] = updatedOptions;
+ updated = true;
+ }
+ }
- if (updated) {
- store.set("plugins.shortcuts", options);
- }
- },
- ">=1.11.0": (store) => {
- if (store.get("options.resumeOnStart") === undefined) {
- store.set("options.resumeOnStart", true);
- }
- },
- ">=1.7.0": (store) => {
- const enabledPlugins = store.get("plugins");
- if (!Array.isArray(enabledPlugins)) {
- console.warn("Plugins are not in array format, cannot migrate");
- return;
- }
+ if (updated) {
+ store.set('plugins.shortcuts', options);
+ }
+ },
+ '>=1.11.0'(store) {
+ if (store.get('options.resumeOnStart') === undefined) {
+ store.set('options.resumeOnStart', true);
+ }
+ },
+ '>=1.7.0'(store) {
+ const enabledPlugins = store.get('plugins');
+ if (!Array.isArray(enabledPlugins)) {
+ console.warn('Plugins are not in array format, cannot migrate');
+ return;
+ }
- // Include custom options
- const plugins = {
- adblocker: {
- enabled: true,
- cache: true,
- additionalBlockLists: [],
- },
- downloader: {
- enabled: false,
- ffmpegArgs: [], // e.g. ["-b:a", "192k"] for an audio bitrate of 192kb/s
- downloadFolder: undefined, // Custom download folder (absolute path)
- },
- };
- enabledPlugins.forEach((enabledPlugin) => {
- plugins[enabledPlugin] = {
- ...plugins[enabledPlugin],
- enabled: true,
- };
- });
- store.set("plugins", plugins);
- },
+ // Include custom options
+ const plugins = {
+ adblocker: {
+ enabled: true,
+ cache: true,
+ additionalBlockLists: [],
+ },
+ downloader: {
+ enabled: false,
+ ffmpegArgs: [], // E.g. ["-b:a", "192k"] for an audio bitrate of 192kb/s
+ downloadFolder: undefined, // Custom download folder (absolute path)
+ },
+ };
+ for (const enabledPlugin of enabledPlugins) {
+ plugins[enabledPlugin] = {
+ ...plugins[enabledPlugin],
+ enabled: true,
+ };
+ }
+
+ store.set('plugins', plugins);
+ },
};
module.exports = new Store({
- defaults,
- clearInvalidConfig: false,
- migrations,
+ defaults,
+ clearInvalidConfig: false,
+ migrations,
});
diff --git a/docs/img/adblock.svg b/docs/img/adblock.svg
index a64d1cad..3a540d7f 100644
--- a/docs/img/adblock.svg
+++ b/docs/img/adblock.svg
@@ -1 +1,9 @@
-
\ No newline at end of file
+
+
+
+
+
+
diff --git a/docs/img/bg-bottom.svg b/docs/img/bg-bottom.svg
index 7b905e2b..65be2bd7 100644
--- a/docs/img/bg-bottom.svg
+++ b/docs/img/bg-bottom.svg
@@ -1 +1,23 @@
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/img/bg-top.svg b/docs/img/bg-top.svg
index 07c3ad19..9eae3cdd 100644
--- a/docs/img/bg-top.svg
+++ b/docs/img/bg-top.svg
@@ -1 +1,32 @@
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/img/code.svg b/docs/img/code.svg
index 9867dbf1..75ccd91c 100644
--- a/docs/img/code.svg
+++ b/docs/img/code.svg
@@ -1 +1,5 @@
-</>
\ No newline at end of file
+
+ </>
+
+
diff --git a/docs/img/download.svg b/docs/img/download.svg
index ab5defb5..6de6cbb7 100644
--- a/docs/img/download.svg
+++ b/docs/img/download.svg
@@ -1 +1,8 @@
-
\ No newline at end of file
+
+
+
+
+
diff --git a/docs/img/footer.svg b/docs/img/footer.svg
index 81f1831b..bf70e447 100644
--- a/docs/img/footer.svg
+++ b/docs/img/footer.svg
@@ -1 +1,35 @@
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/img/plugins.svg b/docs/img/plugins.svg
index d499c520..9aab85e8 100644
--- a/docs/img/plugins.svg
+++ b/docs/img/plugins.svg
@@ -1 +1,6 @@
-
\ No newline at end of file
+
+
+
+
diff --git a/docs/img/youtube-music.svg b/docs/img/youtube-music.svg
index c7674c63..d73ce8d9 100644
--- a/docs/img/youtube-music.svg
+++ b/docs/img/youtube-music.svg
@@ -1 +1,6 @@
-
\ No newline at end of file
+
+
+
+
+
diff --git a/docs/index.html b/docs/index.html
index 22a2e8e5..9ad69381 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -1,138 +1,137 @@
-
-
+
+
-
-
- YouTube Music Desktop App (Unofficial)
-
-
-
-
-
+
+
+ YouTube Music Desktop App (Unofficial)
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
- Custom YouTube Music Desktop App
-
-
- Open source, cross-platform, unofficial YouTube Music Desktop
- App with built-in ad blocker and
- downloader
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+ Custom YouTube Music Desktop App
+
+
+ Open source, cross-platform, unofficial YouTube Music Desktop
+ App with built-in ad blocker and
+ downloader
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
-
Built-in adblocker
-
Block all ads and tracking out of the box
-
-
-
-
-
Built-in adblocker
+
Block all ads and tracking out of the box
+
+
+
+
+
-
-
-
Built-in downloader
-
- Download (like youtube-dl) to custom formats (mp3, opus,
- etc) directly from the interface
-
-
-
-
-
-
Built-in downloader
+
+ Download (like youtube-dl) to custom formats (mp3, opus,
+ etc) directly from the interface
+
+
+
+
+
+
-
-
-
Many other plugins in one click
-
- Enhance your user experience with media keys, integrations
- (Discord), cosmetic filters, notifications, TouchBar,
- auto-unpause and many more! Every plugin can be enabled or
- disabled in one click.
-
-
-
-
-
-
Many other plugins in one click
+
+ Enhance your user experience with media keys, integrations
+ (Discord), cosmetic filters, notifications, TouchBar,
+ auto-unpause and many more! Every plugin can be enabled or
+ disabled in one click.
+
+
+
+
+
+
-
-
-
Open source & Cross platform
-
- Available for Windows (installer and portable), Mac and
- Linux (AppImage, deb, etc)
-
-
-
-
-
-
-
-
-
-
-
+ >
+
Open source & Cross platform
+
+ Available for Windows (installer and portable), Mac and
+ Linux (AppImage, deb, etc)
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
+
+
diff --git a/docs/js/main.js b/docs/js/main.js
index ed47bfc1..8ca35d2a 100644
--- a/docs/js/main.js
+++ b/docs/js/main.js
@@ -1,45 +1,45 @@
// Constants
-const element = document.documentElement,
- body = document.body,
- revealOnScroll = (window.sr = ScrollReveal({ mobile: false }));
+const element = document.documentElement;
+const { body } = document;
+const revealOnScroll = (window.sr = ScrollReveal({ mobile: false }));
// Load animations
-element.classList.remove("no-js");
-element.classList.add("js");
-window.addEventListener("load", function () {
- body.classList.add("is-loaded");
+element.classList.remove('no-js');
+element.classList.add('js');
+window.addEventListener('load', () => {
+ body.classList.add('is-loaded');
});
-if (body.classList.contains("has-animations")) {
- window.addEventListener("load", function () {
- revealOnScroll.reveal(".feature-extended .device-mockup", {
+if (body.classList.contains('has-animations')) {
+ window.addEventListener('load', () => {
+ revealOnScroll.reveal('.feature-extended .device-mockup', {
duration: 600,
- distance: "100px",
- easing: "cubic-bezier(0.215, 0.61, 0.355, 1)",
- origin: "bottom",
+ distance: '100px',
+ easing: 'cubic-bezier(0.215, 0.61, 0.355, 1)',
+ origin: 'bottom',
viewFactor: 0.6,
});
- revealOnScroll.reveal(".feature-extended .feature-extended-body", {
+ revealOnScroll.reveal('.feature-extended .feature-extended-body', {
duration: 600,
- distance: "40px",
- easing: "cubic-bezier(0.215, 0.61, 0.355, 1)",
- origin: "top",
+ distance: '40px',
+ easing: 'cubic-bezier(0.215, 0.61, 0.355, 1)',
+ origin: 'top',
viewFactor: 0.6,
});
});
}
// Bubble canvas
-let bubbleCanvas = function (t) {
- let e = this;
+const bubbleCanvas = function (t) {
+ const e = this;
e.parentNode = t;
e.setCanvasSize();
- window.addEventListener("resize", function () {
+ window.addEventListener('resize', () => {
e.setCanvasSize();
});
e.mouseX = 0;
e.mouseY = 0;
- window.addEventListener("mousemove", function (t) {
+ window.addEventListener('mousemove', (t) => {
(e.mouseX = t.clientX), (e.mouseY = t.clientY);
});
e.randomise();
@@ -55,15 +55,15 @@ bubbleCanvas.prototype.generateDecimalBetween = function (start, end) {
};
bubbleCanvas.prototype.update = function () {
- let t = this;
- t.translateX = t.translateX - t.movementX;
- t.translateY = t.translateY - t.movementY;
+ const t = this;
+ t.translateX -= t.movementX;
+ t.translateY -= t.movementY;
t.posX += (t.mouseX / (t.staticity / t.magnetism) - t.posX) / t.smoothFactor;
t.posY += (t.mouseY / (t.staticity / t.magnetism) - t.posY) / t.smoothFactor;
if (
- t.translateY + t.posY < 0 ||
- t.translateX + t.posX < 0 ||
- t.translateX + t.posX > t.canvasWidth
+ t.translateY + t.posY < 0
+ || t.translateX + t.posX < 0
+ || t.translateX + t.posX > t.canvasWidth
) {
t.randomise();
t.translateY = t.canvasHeight;
@@ -71,7 +71,7 @@ bubbleCanvas.prototype.update = function () {
};
bubbleCanvas.prototype.randomise = function () {
- this.colors = ["195,53,46", "172,54,46"];
+ this.colors = ['195,53,46', '172,54,46'];
this.velocity = 20;
this.smoothFactor = 50;
@@ -88,17 +88,17 @@ bubbleCanvas.prototype.randomise = function () {
this.translateY = this.generateDecimalBetween(0, this.canvasHeight);
};
-let drawBubbleCanvas = function (t) {
+const drawBubbleCanvas = function (t) {
this.canvas = document.getElementById(t);
- this.ctx = this.canvas.getContext("2d");
+ this.ctx = this.canvas.getContext('2d');
this.dpr = window.devicePixelRatio;
};
drawBubbleCanvas.prototype.start = function (bubbleDensity) {
- let t = this;
+ const t = this;
t.bubbleDensity = bubbleDensity;
t.setCanvasSize();
- window.addEventListener("resize", function () {
+ window.addEventListener('resize', () => {
t.setCanvasSize();
});
t.bubblesList = [];
@@ -114,23 +114,24 @@ drawBubbleCanvas.prototype.setCanvasSize = function () {
this.hdpi = this.h * this.dpr;
this.canvas.width = this.wdpi;
this.canvas.height = this.hdpi;
- this.canvas.style.width = this.w + "px";
- this.canvas.style.height = this.h + "px";
+ this.canvas.style.width = this.w + 'px';
+ this.canvas.style.height = this.h + 'px';
this.ctx.scale(this.dpr, this.dpr);
};
drawBubbleCanvas.prototype.animate = function () {
- let t = this;
+ const t = this;
t.ctx.clearRect(0, 0, t.canvas.clientWidth, t.canvas.clientHeight);
- t.bubblesList.forEach(function (e) {
+ for (const e of t.bubblesList) {
e.update();
t.ctx.translate(e.translateX, e.translateY);
t.ctx.beginPath();
t.ctx.arc(e.posX, e.posY, e.size, 0, 2 * Math.PI);
- t.ctx.fillStyle = "rgba(" + e.color + "," + e.alpha + ")";
+ t.ctx.fillStyle = 'rgba(' + e.color + ',' + e.alpha + ')';
t.ctx.fill();
t.ctx.setTransform(t.dpr, 0, 0, t.dpr, 0, 0);
- });
+ }
+
requestAnimationFrame(this.animate.bind(this));
};
@@ -139,15 +140,16 @@ drawBubbleCanvas.prototype.addBubble = function (t) {
};
drawBubbleCanvas.prototype.generateBubbles = function () {
- let t = this;
- for (let e = 0; e < t.bubbleDensity; e++)
+ const t = this;
+ for (let e = 0; e < t.bubbleDensity; e++) {
t.addBubble(new bubbleCanvas(t.canvas.parentNode));
+ }
};
// Night sky with stars canvas
-let starCanvas = function (t) {
+const starCanvas = function (t) {
this.canvas = document.getElementById(t);
- this.ctx = this.canvas.getContext("2d");
+ this.ctx = this.canvas.getContext('2d');
this.dpr = window.devicePixelRatio;
};
@@ -156,17 +158,17 @@ starCanvas.prototype.start = function () {
let h;
const setCanvasExtents = () => {
- w = this.canvas.parentNode.clientWidth;
- h = this.canvas.parentNode.clientHeight;
+ w = this.canvas.parentNode.clientWidth;
+ h = this.canvas.parentNode.clientHeight;
this.canvas.width = w;
this.canvas.height = h;
};
setCanvasExtents();
- window.onresize = () => {
+ window.addEventListener('resize', () => {
setCanvasExtents();
- };
+ });
const makeStars = (count) => {
const out = [];
@@ -178,19 +180,20 @@ starCanvas.prototype.start = function () {
};
out.push(s);
}
+
return out;
};
- let stars = makeStars(10000);
+ const stars = makeStars(10_000);
const clear = () => {
- this.ctx.fillStyle = "#212121";
+ this.ctx.fillStyle = '#212121';
this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);
};
const putPixel = (x, y, brightness) => {
const intensity = brightness * 255;
- const rgb = "rgb(" + intensity + "," + intensity + "," + intensity + ")";
+ const rgb = 'rgb(' + intensity + ',' + intensity + ',' + intensity + ')';
this.ctx.beginPath();
this.ctx.arc(x, y, 0.9, 0, 2 * Math.PI);
this.ctx.fillStyle = rgb;
@@ -199,7 +202,7 @@ starCanvas.prototype.start = function () {
const moveStars = (distance) => {
const count = stars.length;
- for (var i = 0; i < count; i++) {
+ for (let i = 0; i < count; i++) {
const s = stars[i];
s.z -= distance;
while (s.z <= 1) {
@@ -208,15 +211,15 @@ starCanvas.prototype.start = function () {
}
};
- let prevTime;
+ let previousTime;
const init = (time) => {
- prevTime = time;
+ previousTime = time;
requestAnimationFrame(tick);
};
const tick = (time) => {
- let elapsed = time - prevTime;
- prevTime = time;
+ const elapsed = time - previousTime;
+ previousTime = time;
moveStars(elapsed * 0.1);
@@ -226,7 +229,7 @@ starCanvas.prototype.start = function () {
const cy = h / 2;
const count = stars.length;
- for (var i = 0; i < count; i++) {
+ for (let i = 0; i < count; i++) {
const star = stars[i];
const x = cx + star.x / (star.z * 0.001);
@@ -236,7 +239,7 @@ starCanvas.prototype.start = function () {
continue;
}
- const d = star.z / 1000.0;
+ const d = star.z / 1000;
const b = 1 - d * d;
putPixel(x, y, b);
@@ -249,12 +252,12 @@ starCanvas.prototype.start = function () {
};
// Start canvas animations
-window.addEventListener("load", function () {
+window.addEventListener('load', () => {
// Stars
- const headCanvas = new starCanvas("hero-particles");
+ const headCanvas = new starCanvas('hero-particles');
// Bubbles
- const footerCanvas = new drawBubbleCanvas("footer-particles");
- const mainCanvas = new drawBubbleCanvas("main-particles");
+ const footerCanvas = new drawBubbleCanvas('footer-particles');
+ const mainCanvas = new drawBubbleCanvas('main-particles');
headCanvas.start();
footerCanvas.start(30);
diff --git a/docs/style/fonts.css b/docs/style/fonts.css
index 8183c438..fac73089 100644
--- a/docs/style/fonts.css
+++ b/docs/style/fonts.css
@@ -6,6 +6,7 @@
src: url(https://fonts.gstatic.com/s/heebo/v9/NGS6v5_NC0k9P9H0TbFhsqMA6aw.woff2) format('woff2');
unicode-range: U+0590-05FF, U+20AA, U+25CC, U+FB1D-FB4F;
}
+
/* latin */
@font-face {
font-family: 'Heebo';
@@ -14,6 +15,7 @@
src: url(https://fonts.gstatic.com/s/heebo/v9/NGS6v5_NC0k9P9H2TbFhsqMA.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
+
/* hebrew */
@font-face {
font-family: 'Heebo';
@@ -22,6 +24,7 @@
src: url(https://fonts.gstatic.com/s/heebo/v9/NGS6v5_NC0k9P9H0TbFhsqMA6aw.woff2) format('woff2');
unicode-range: U+0590-05FF, U+20AA, U+25CC, U+FB1D-FB4F;
}
+
/* latin */
@font-face {
font-family: 'Heebo';
@@ -30,6 +33,7 @@
src: url(https://fonts.gstatic.com/s/heebo/v9/NGS6v5_NC0k9P9H2TbFhsqMA.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
+
/* latin-ext */
@font-face {
font-family: 'Oxygen';
@@ -38,6 +42,7 @@
src: url(https://fonts.gstatic.com/s/oxygen/v10/2sDcZG1Wl4LcnbuCNWgzZmW5Kb8VZBHR.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
+
/* latin */
@font-face {
font-family: 'Oxygen';
diff --git a/docs/style/style.css b/docs/style/style.css
index dea047b9..1106ca62 100644
--- a/docs/style/style.css
+++ b/docs/style/style.css
@@ -3,9 +3,11 @@ html {
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
}
+
body {
margin: 0;
}
+
article,
aside,
footer,
@@ -14,61 +16,75 @@ nav,
section {
display: block;
}
+
h1 {
font-size: 2em;
margin: 0.67em 0;
}
+
figcaption,
figure,
main {
display: block;
}
+
figure {
margin: 1em 40px;
}
+
hr {
box-sizing: content-box;
height: 0;
overflow: visible;
}
+
pre {
font-family: monospace, monospace;
font-size: 1em;
}
+
a {
background-color: transparent;
-webkit-text-decoration-skip: objects;
}
+
abbr[title] {
border-bottom: none;
text-decoration: underline;
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
}
+
b,
strong {
font-weight: inherit;
}
+
b,
strong {
font-weight: bolder;
}
+
code,
kbd,
samp {
font-family: monospace, monospace;
font-size: 1em;
}
+
dfn {
font-style: italic;
}
+
mark {
background-color: #ff0;
color: #000;
}
+
small {
font-size: 80%;
}
+
sub,
sup {
font-size: 75%;
@@ -76,26 +92,33 @@ sup {
position: relative;
vertical-align: baseline;
}
+
sub {
bottom: -0.25em;
}
+
sup {
top: -0.5em;
}
+
audio,
video {
display: inline-block;
}
+
audio:not([controls]) {
display: none;
height: 0;
}
+
img {
border-style: none;
}
+
svg:not(:root) {
overflow: hidden;
}
+
button,
input,
optgroup,
@@ -106,20 +129,24 @@ textarea {
line-height: 1.15;
margin: 0;
}
+
button,
input {
overflow: visible;
}
+
button,
select {
text-transform: none;
}
+
button,
html [type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
+
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
@@ -127,15 +154,18 @@ button::-moz-focus-inner,
border-style: none;
padding: 0;
}
+
button:-moz-focusring,
[type="button"]:-moz-focusring,
[type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
}
+
fieldset {
padding: 0.35em 0.75em 0.625em;
}
+
legend {
box-sizing: border-box;
color: inherit;
@@ -144,63 +174,79 @@ legend {
padding: 0;
white-space: normal;
}
+
progress {
display: inline-block;
vertical-align: baseline;
}
+
textarea {
overflow: auto;
}
+
[type="checkbox"],
[type="radio"] {
box-sizing: border-box;
padding: 0;
}
+
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
+
[type="search"] {
-webkit-appearance: textfield;
outline-offset: -2px;
}
+
[type="search"]::-webkit-search-cancel-button,
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
+
::-webkit-file-upload-button {
-webkit-appearance: button;
font: inherit;
}
+
details,
menu {
display: block;
}
+
summary {
display: list-item;
}
+
canvas {
display: inline-block;
}
+
template {
display: none;
}
+
[hidden] {
display: none;
}
+
html {
box-sizing: border-box;
}
+
*,
*:before,
*:after {
box-sizing: inherit;
}
+
body {
background: #3f4042;
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
}
+
hr {
border: 0;
display: block;
@@ -209,81 +255,101 @@ hr {
margin-top: 24px;
margin-bottom: 24px;
}
+
ul,
ol {
margin-top: 0;
margin-bottom: 24px;
padding-left: 24px;
}
+
ul {
list-style: disc;
}
+
ol {
list-style: decimal;
}
+
li > ul,
li > ol {
margin-bottom: 0;
}
+
dl {
margin-top: 0;
margin-bottom: 24px;
}
+
dt {
font-weight: 600;
}
+
dd {
margin-left: 24px;
margin-bottom: 24px;
}
+
img {
height: auto;
max-width: 100%;
vertical-align: middle;
}
+
figure {
margin: 24px 0;
}
+
figcaption {
font-size: 16px;
line-height: 24px;
padding: 8px 0;
}
+
img,
svg {
display: block;
}
+
table {
border-collapse: collapse;
margin-bottom: 24px;
width: 100%;
}
+
tr {
border-bottom: 1px solid #e4e8ee;
}
+
th {
text-align: left;
}
+
th,
td {
padding: 10px 16px;
}
+
th:first-child,
td:first-child {
padding-left: 0;
}
+
th:last-child,
td:last-child {
padding-right: 0;
}
+
html {
font-size: 20px;
line-height: 30px;
}
+
body {
color: #b7bbc1;
font-size: 1rem;
}
+
body,
button,
input,
@@ -291,15 +357,18 @@ select,
textarea {
font-family: "Heebo", sans-serif;
}
+
a {
color: #c3352e;
text-decoration: none;
}
+
a:hover,
a:active {
outline: 0;
text-decoration: underline;
}
+
h1,
h2,
h3,
@@ -317,12 +386,14 @@ h6,
font-family: "Oxygen", sans-serif;
font-weight: 600;
}
+
h1,
.h1 {
font-size: 38px;
line-height: 48px;
letter-spacing: 0px;
}
+
@media (min-width: 641px) {
h1,
.h1 {
@@ -331,12 +402,14 @@ h1,
letter-spacing: 0px;
}
}
+
h2,
.h2 {
font-size: 32px;
line-height: 42px;
letter-spacing: 0px;
}
+
@media (min-width: 641px) {
h2,
.h2 {
@@ -345,6 +418,7 @@ h2,
letter-spacing: 0px;
}
}
+
h3,
.h3,
blockquote {
@@ -352,6 +426,7 @@ blockquote {
line-height: 34px;
letter-spacing: 0px;
}
+
@media (min-width: 641px) {
h3,
.h3,
@@ -361,12 +436,14 @@ blockquote {
letter-spacing: 0px;
}
}
+
h4,
.h4 {
font-size: 28px;
line-height: 34px;
letter-spacing: 0px;
}
+
h5,
.h5,
h6,
@@ -375,27 +452,32 @@ h6,
line-height: 30px;
letter-spacing: -0.1px;
}
+
@media (max-width: 640px) {
.h1-mobile {
font-size: 38px;
line-height: 48px;
letter-spacing: 0px;
}
+
.h2-mobile {
font-size: 32px;
line-height: 42px;
letter-spacing: 0px;
}
+
.h3-mobile {
font-size: 28px;
line-height: 34px;
letter-spacing: 0px;
}
+
.h4-mobile {
font-size: 28px;
line-height: 34px;
letter-spacing: 0px;
}
+
.h5-mobile,
.h6-mobile {
font-size: 20px;
@@ -403,12 +485,15 @@ h6,
letter-spacing: -0.1px;
}
}
+
.text-light {
color: #606483;
}
+
.text-light a {
color: #606483;
}
+
.text-light h1,
.text-light h2,
.text-light h3,
@@ -423,16 +508,19 @@ h6,
.text-light .h6 {
color: #fff !important;
}
+
.text-sm {
font-size: 18px;
line-height: 27px;
letter-spacing: -0.1px;
}
+
.text-xs {
font-size: 16px;
line-height: 24px;
letter-spacing: -0.1px;
}
+
h1,
h2,
.h1,
@@ -440,11 +528,13 @@ h2,
margin-top: 48px;
margin-bottom: 16px;
}
+
h3,
.h3 {
margin-top: 36px;
margin-bottom: 12px;
}
+
h4,
h5,
h6,
@@ -454,16 +544,19 @@ h6,
margin-top: 24px;
margin-bottom: 4px;
}
+
p {
margin-top: 0;
margin-bottom: 24px;
}
+
dfn,
cite,
em,
i {
font-style: italic;
}
+
blockquote {
color: #b7bbc1;
font-style: italic;
@@ -471,15 +564,19 @@ blockquote {
margin-bottom: 24px;
margin-left: 24px;
}
+
blockquote::before {
content: "\201C";
}
+
blockquote::after {
content: "\201D";
}
+
blockquote p {
display: inline;
}
+
address {
color: #b7bbc1;
border-width: 1px 0;
@@ -488,6 +585,7 @@ address {
padding: 24px 0;
margin: 0 0 24px;
}
+
pre,
pre h1,
pre h2,
@@ -503,6 +601,7 @@ pre .h5,
pre .h6 {
font-family: "Courier 10 Pitch", Courier, monospace;
}
+
pre,
code,
kbd,
@@ -510,6 +609,7 @@ tt,
var {
background: #f3f4ff;
}
+
pre {
font-size: 16px;
line-height: 24px;
@@ -520,6 +620,7 @@ pre {
margin-top: 24px;
margin-bottom: 24px;
}
+
code,
kbd,
tt,
@@ -528,23 +629,28 @@ var {
font-size: 16px;
padding: 2px 4px;
}
+
abbr,
acronym {
cursor: help;
}
+
mark,
ins {
text-decoration: none;
}
+
small {
font-size: 18px;
line-height: 27px;
letter-spacing: -0.1px;
}
+
b,
strong {
font-weight: 600;
}
+
button,
input,
select,
@@ -553,6 +659,7 @@ label {
font-size: 20px;
line-height: 30px;
}
+
.container,
.container-sm {
width: 100%;
@@ -560,6 +667,7 @@ label {
padding-left: 16px;
padding-right: 16px;
}
+
@media (min-width: 481px) {
.container,
.container-sm {
@@ -567,17 +675,21 @@ label {
padding-right: 24px;
}
}
+
.container {
max-width: 1128px;
}
+
.container-sm {
max-width: 848px;
}
+
.container .container-sm {
max-width: 800px;
padding-left: 0;
padding-right: 0;
}
+
.screen-reader-text {
clip: rect(1px, 1px, 1px, 1px);
position: absolute !important;
@@ -586,6 +698,7 @@ label {
overflow: hidden;
word-wrap: normal !important;
}
+
.screen-reader-text:focus {
border-radius: 2px;
box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6);
@@ -607,28 +720,36 @@ label {
width: auto;
z-index: 100000;
}
+
.list-reset {
list-style: none;
padding: 0;
}
+
.text-left {
text-align: left;
}
+
.text-center {
text-align: center;
}
+
.text-right {
text-align: right;
}
+
.text-primary {
color: #c3352e;
}
+
.text-secondary {
color: #ff6c50;
}
+
.has-top-divider {
position: relative;
}
+
.has-top-divider::before {
content: "";
position: absolute;
@@ -639,9 +760,11 @@ label {
height: 1px;
background: #e4e8ee;
}
+
.has-bottom-divider {
position: relative;
}
+
.has-bottom-divider::after {
content: "";
position: absolute;
@@ -652,279 +775,371 @@ label {
height: 1px;
background: #e4e8ee;
}
+
.m-0 {
margin: 0;
}
+
.mt-0 {
margin-top: 0;
}
+
.mr-0 {
margin-right: 0;
}
+
.mb-0 {
margin-bottom: 0;
}
+
.ml-0 {
margin-left: 0;
}
+
.m-8 {
margin: 8px;
}
+
.mt-8 {
margin-top: 8px;
}
+
.mr-8 {
margin-right: 8px;
}
+
.mb-8 {
margin-bottom: 8px;
}
+
.ml-8 {
margin-left: 8px;
}
+
.m-16 {
margin: 16px;
}
+
.mt-16 {
margin-top: 16px;
}
+
.mr-16 {
margin-right: 16px;
}
+
.mb-16 {
margin-bottom: 16px;
}
+
.ml-16 {
margin-left: 16px;
}
+
.m-24 {
margin: 24px;
}
+
.mt-24 {
margin-top: 24px;
}
+
.mr-24 {
margin-right: 24px;
}
+
.mb-24 {
margin-bottom: 24px;
}
+
.ml-24 {
margin-left: 24px;
}
+
.m-32 {
margin: 32px;
}
+
.mt-32 {
margin-top: 32px;
}
+
.mr-32 {
margin-right: 32px;
}
+
.mb-32 {
margin-bottom: 32px;
}
+
.ml-32 {
margin-left: 32px;
}
+
.m-40 {
margin: 40px;
}
+
.mt-40 {
margin-top: 40px;
}
+
.mr-40 {
margin-right: 40px;
}
+
.mb-40 {
margin-bottom: 40px;
}
+
.ml-40 {
margin-left: 40px;
}
+
.m-48 {
margin: 48px;
}
+
.mt-48 {
margin-top: 48px;
}
+
.mr-48 {
margin-right: 48px;
}
+
.mb-48 {
margin-bottom: 48px;
}
+
.ml-48 {
margin-left: 48px;
}
+
.m-56 {
margin: 56px;
}
+
.mt-56 {
margin-top: 56px;
}
+
.mr-56 {
margin-right: 56px;
}
+
.mb-56 {
margin-bottom: 56px;
}
+
.ml-56 {
margin-left: 56px;
}
+
.m-64 {
margin: 64px;
}
+
.mt-64 {
margin-top: 64px;
}
+
.mr-64 {
margin-right: 64px;
}
+
.mb-64 {
margin-bottom: 64px;
}
+
.ml-64 {
margin-left: 64px;
}
+
.p-0 {
padding: 0;
}
+
.pt-0 {
padding-top: 0;
}
+
.pr-0 {
padding-right: 0;
}
+
.pb-0 {
padding-bottom: 0;
}
+
.pl-0 {
padding-left: 0;
}
+
.p-8 {
padding: 8px;
}
+
.pt-8 {
padding-top: 8px;
}
+
.pr-8 {
padding-right: 8px;
}
+
.pb-8 {
padding-bottom: 8px;
}
+
.pl-8 {
padding-left: 8px;
}
+
.p-16 {
padding: 16px;
}
+
.pt-16 {
padding-top: 16px;
}
+
.pr-16 {
padding-right: 16px;
}
+
.pb-16 {
padding-bottom: 16px;
}
+
.pl-16 {
padding-left: 16px;
}
+
.p-24 {
padding: 24px;
}
+
.pt-24 {
padding-top: 24px;
}
+
.pr-24 {
padding-right: 24px;
}
+
.pb-24 {
padding-bottom: 24px;
}
+
.pl-24 {
padding-left: 24px;
}
+
.p-32 {
padding: 32px;
}
+
.pt-32 {
padding-top: 32px;
}
+
.pr-32 {
padding-right: 32px;
}
+
.pb-32 {
padding-bottom: 32px;
}
+
.pl-32 {
padding-left: 32px;
}
+
.p-40 {
padding: 40px;
}
+
.pt-40 {
padding-top: 40px;
}
+
.pr-40 {
padding-right: 40px;
}
+
.pb-40 {
padding-bottom: 40px;
}
+
.pl-40 {
padding-left: 40px;
}
+
.p-48 {
padding: 48px;
}
+
.pt-48 {
padding-top: 48px;
}
+
.pr-48 {
padding-right: 48px;
}
+
.pb-48 {
padding-bottom: 48px;
}
+
.pl-48 {
padding-left: 48px;
}
+
.p-56 {
padding: 56px;
}
+
.pt-56 {
padding-top: 56px;
}
+
.pr-56 {
padding-right: 56px;
}
+
.pb-56 {
padding-bottom: 56px;
}
+
.pl-56 {
padding-left: 56px;
}
+
.p-64 {
padding: 64px;
}
+
.pt-64 {
padding-top: 64px;
}
+
.pr-64 {
padding-right: 64px;
}
+
.pb-64 {
padding-bottom: 64px;
}
+
.pl-64 {
padding-left: 64px;
}
+
.sr .has-animations .is-revealing {
visibility: hidden;
}
+
.button {
display: inline-flex;
font-size: 14px;
@@ -945,15 +1160,19 @@ label {
text-align: center;
white-space: nowrap;
}
+
.button:active {
outline: 0;
}
+
.button::before {
border-radius: 2px;
}
+
.button-shadow {
position: relative;
}
+
.button-shadow::before {
content: "";
position: absolute;
@@ -965,70 +1184,90 @@ label {
mix-blend-mode: multiply;
transition: box-shadow 0.15s ease;
}
+
.button-shadow:hover::before {
box-shadow: 0 8px 16px rgba(22, 30, 42, 0.16);
}
+
.button-sm {
padding: 8px 24px;
height: 32px;
}
+
.button-sm.button-shadow::before {
box-shadow: 0 4px 16px rgba(22, 30, 42, 0.12);
}
+
.button-sm.button-shadow:hover::before {
box-shadow: 0 4px 16px rgba(22, 30, 42, 0.16);
}
+
.button-primary,
.button-secondary {
color: #fff !important;
transition: background 0.15s ease;
}
+
.button-primary {
background: #c3352e;
}
+
.button-primary:hover {
background: #ac362e;
}
+
.button-primary.button-shadow::before {
box-shadow: 0 8px 16px rgba(66, 52, 248, 0.24);
}
+
.button-primary.button-shadow:hover::before {
box-shadow: 0 8px 16px rgba(66, 52, 248, 0.32);
}
+
.button-primary .button-sm.button-shadow::before {
box-shadow: 0 4px 16px rgba(66, 52, 248, 0.24);
}
+
.button-primary .button-sm.button-shadow:hover::before {
box-shadow: 0 4px 16px rgba(66, 52, 248, 0.32);
}
+
.button-secondary {
background: #ff6c50;
}
+
.button-secondary:hover {
background: #ac362e;
}
+
.button-secondary.button-shadow::before {
box-shadow: 0 8px 16px rgba(255, 108, 80, 0.24);
}
+
.button-secondary.button-shadow:hover::before {
box-shadow: 0 8px 16px rgba(255, 108, 80, 0.32);
}
+
.button-secondary .button-sm.button-shadow::before {
box-shadow: 0 4px 16px rgba(255, 108, 80, 0.24);
}
+
.button-secondary .button-sm.button-shadow:hover::before {
box-shadow: 0 4px 16px rgba(255, 108, 80, 0.32);
}
+
.button-block {
display: flex;
width: 100%;
}
+
@media (max-width: 640px) {
.button-wide-mobile {
width: 100%;
max-width: 280px;
}
}
+
.site-header {
padding: 24px 0;
position: absolute;
@@ -1037,18 +1276,22 @@ label {
width: 100%;
z-index: 1;
}
+
.site-header-inner {
position: relative;
display: flex;
justify-content: space-between;
align-items: center;
}
+
.header-links {
display: inline-flex;
}
+
.header-links li {
display: inline-flex;
}
+
.header-links a:not(.button) {
font-size: 16px;
line-height: 24px;
@@ -1060,16 +1303,19 @@ label {
line-height: 16px;
padding: 8px 24px;
}
+
.header-links a:not(.button):hover,
.header-links a:not(.button):active {
color: #fff;
}
+
.hero {
position: relative;
padding-top: 128px;
padding-bottom: 88px;
z-index: 0;
}
+
.hero .hero-bg {
position: absolute;
top: 0;
@@ -1079,6 +1325,7 @@ label {
background: #363636;
z-index: -2;
}
+
.hero .hero-particles-container {
position: absolute;
top: 0;
@@ -1086,6 +1333,7 @@ label {
left: 0;
right: 0;
}
+
.hero::before,
.hero::after {
content: "";
@@ -1094,52 +1342,63 @@ label {
width: 720px;
background-repeat: no-repeat;
}
+
.hero::before {
top: 0;
height: 159px;
background-image: url("../img/bg-top.svg");
background-size: 720px 159px;
}
+
.hero::after {
bottom: 42%;
height: 173px;
background-image: url("../img/bg-bottom.svg");
background-size: 720px 173px;
}
+
.hero-inner {
position: relative;
z-index: 1;
}
+
.hero-copy {
position: relative;
margin-bottom: 48px;
}
+
@media (min-width: 641px) {
.hero {
padding-top: 160px;
padding-bottom: 128px;
}
+
.hero::before,
.hero::after {
left: calc(50% - 720px);
width: 1440px;
}
+
.hero::before {
height: 318px;
background-size: 1440px 318px;
}
+
.hero::after {
height: 347px;
background-size: 1440px 347px;
}
+
.hero-copy {
margin-bottom: 88px;
}
+
.hero-paragraph {
padding-left: 72px;
padding-right: 72px;
}
}
+
.has-animations .hero .hero-bg,
.has-animations .hero::before,
.has-animations .hero::after,
@@ -1152,40 +1411,45 @@ label {
.has-animations .hero .device-mockup {
opacity: 0;
}
+
.has-animations.is-loaded .hero .hero-bg {
-webkit-animation: heroBg 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards;
animation: heroBg 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards;
}
+
.has-animations.is-loaded .hero::before,
.has-animations.is-loaded .hero::after {
-webkit-animation: heroFadeIn 0.6s ease forwards 0.45s;
animation: heroFadeIn 0.6s ease forwards 0.45s;
}
+
.has-animations.is-loaded .site-header,
.has-animations.is-loaded .hero-particles-container,
.has-animations.is-loaded .hero .mockup-bg {
-webkit-animation: heroFadeIn 0.6s ease forwards 0.45s;
animation: heroFadeIn 0.6s ease forwards 0.45s;
}
+
.has-animations.is-loaded .hero-title {
- -webkit-animation: heroContent 0.6s cubic-bezier(0.215, 0.61, 0.355, 1)
- forwards 0.15s;
+ -webkit-animation: heroContent 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards 0.15s;
animation: heroContent 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards 0.15s;
}
+
.has-animations.is-loaded .hero-paragraph {
- -webkit-animation: heroContent 0.6s cubic-bezier(0.215, 0.61, 0.355, 1)
- forwards 0.3s;
+ -webkit-animation: heroContent 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards 0.3s;
animation: heroContent 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards 0.3s;
}
+
.has-animations.is-loaded .hero-cta {
- -webkit-animation: heroContent 0.6s cubic-bezier(0.215, 0.61, 0.355, 1)
- forwards 0.45s;
+ -webkit-animation: heroContent 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards 0.45s;
animation: heroContent 0.6s cubic-bezier(0.215, 0.61, 0.355, 1) forwards 0.45s;
}
+
.has-animations.is-loaded .hero .device-mockup {
-webkit-animation: heroMockup 0.6s ease forwards 0.6s;
animation: heroMockup 0.6s ease forwards 0.6s;
}
+
@-webkit-keyframes heroBg {
from {
-webkit-transform: scaleY(0) scaleX(1.2) skewY(30deg);
@@ -1198,6 +1462,7 @@ label {
opacity: 1;
}
}
+
@keyframes heroBg {
from {
-webkit-transform: scaleY(0) scaleX(1.2) skewY(30deg);
@@ -1210,6 +1475,7 @@ label {
opacity: 1;
}
}
+
@-webkit-keyframes heroContent {
from {
-webkit-transform: translateY(40px) skewY(2deg);
@@ -1222,6 +1488,7 @@ label {
opacity: 1;
}
}
+
@keyframes heroContent {
from {
-webkit-transform: translateY(40px) skewY(2deg);
@@ -1234,6 +1501,7 @@ label {
opacity: 1;
}
}
+
@-webkit-keyframes heroMockup {
from {
-webkit-transform: translateY(80px);
@@ -1246,6 +1514,7 @@ label {
opacity: 1;
}
}
+
@keyframes heroMockup {
from {
-webkit-transform: translateY(80px);
@@ -1258,6 +1527,7 @@ label {
opacity: 1;
}
}
+
@-webkit-keyframes heroFadeIn {
from {
opacity: 0;
@@ -1266,6 +1536,7 @@ label {
opacity: 1;
}
}
+
@keyframes heroFadeIn {
from {
opacity: 0;
@@ -1274,9 +1545,11 @@ label {
opacity: 1;
}
}
+
.mockup-container {
position: relative;
}
+
#mockup-header-img {
position: relative;
height: 100%;
@@ -1287,9 +1560,11 @@ label {
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
}
+
.mockup-bg {
pointer-events: none;
}
+
.mockup-bg img,
.mockup-bg svg {
position: absolute;
@@ -1301,6 +1576,7 @@ label {
height: auto;
max-width: 300% !important;
}
+
.device-mockup {
position: relative;
width: 350px;
@@ -1308,34 +1584,43 @@ label {
margin: 0 auto;
z-index: 1;
}
+
.has-animations .features-extended {
opacity: 0;
}
+
.has-animations.is-loaded .features-extended {
opacity: 1;
position: relative;
}
+
.features-extended-header {
margin-bottom: 32px;
}
+
.features-extended-wrap {
display: flex;
flex-wrap: wrap;
margin-top: -24px;
}
+
.features-extended-wrap:last-of-type {
margin-bottom: -24px;
}
+
.features-extended-wrap:not(:last-of-type) {
margin-bottom: 24px;
}
+
.feature-extended {
padding: 24px 0;
}
+
.feature-extended-image {
position: relative;
margin-bottom: 32px;
}
+
.feature-extended-image img,
.feature-extended-image svg {
width: 100%;
@@ -1345,33 +1630,42 @@ label {
margin-right: auto;
overflow: visible;
}
+
.feature-extended-body {
text-align: center;
}
+
@media (min-width: 641px) {
.features-extended .container {
max-width: 912px;
}
+
.features-extended .section-inner {
padding-bottom: 128px;
}
+
.features-extended .section-paragraph {
padding-left: 72px;
padding-right: 72px;
margin-bottom: 0;
}
+
.features-extended-header {
margin-bottom: 80px;
}
+
.features-extended-wrap {
margin-top: -64px;
}
+
.features-extended-wrap:last-of-type {
margin-bottom: -64px;
}
+
.features-extended-wrap:not(:last-of-type) {
margin-bottom: 64px;
}
+
.feature-extended {
display: flex;
flex-wrap: nowrap;
@@ -1379,27 +1673,33 @@ label {
justify-content: flex-end;
padding: 64px 0;
}
+
.feature-extended .feature-extended-image {
width: 440px;
margin-right: 96px;
margin-bottom: 0;
}
+
.feature-extended .feature-extended-image img,
.feature-extended .feature-extended-image svg {
width: auto;
}
+
.feature-extended .feature-extended-image img.device-mockup,
.feature-extended .feature-extended-image svg.device-mockup {
max-width: 200px;
}
+
.feature-extended:nth-child(even) {
justify-content: flex-start;
}
+
.feature-extended:nth-child(even) .feature-extended-image {
order: 1;
margin-left: 96px;
margin-right: 0;
}
+
.feature-extended-body {
display: flex;
flex-direction: column;
@@ -1409,23 +1709,29 @@ label {
text-align: left;
}
}
+
@media (min-width: 1025px) {
.features-extended .container {
max-width: 944px;
}
+
.feature-extended .feature-extended-image {
margin-right: 64px;
}
+
.feature-extended:nth-child(even) .feature-extended-image {
margin-left: 64px;
}
+
.feature-extended-body {
width: 392px;
}
}
+
.cta .section-paragraph {
margin-bottom: 32px;
}
+
@media (min-width: 641px) {
.cta .section-paragraph {
margin-bottom: 32px;
@@ -1433,35 +1739,42 @@ label {
padding-right: 72px;
}
}
+
.body-wrap {
overflow: hidden;
display: flex;
flex-direction: column;
min-height: 100vh;
}
+
.boxed-container {
max-width: 1440px;
margin: 0 auto;
box-shadow: 0 20px 48px rgba(22, 30, 42, 0.16);
}
+
main {
flex: 1 0 auto;
}
+
.section-inner {
position: relative;
padding-top: 48px;
padding-bottom: 48px;
}
+
@media (min-width: 641px) {
.section-inner {
padding-top: 88px;
padding-bottom: 88px;
}
}
+
.site-footer {
position: relative;
background: #212121;
}
+
.site-footer::before {
content: "";
position: absolute;
@@ -1473,6 +1786,7 @@ main {
background-size: 720px 291px;
background-repeat: no-repeat;
}
+
.site-footer .footer-particles-container,
.main-particles-container {
position: absolute;
@@ -1481,20 +1795,24 @@ main {
left: 0;
right: 0;
}
+
.site-footer-bottom {
font-size: 14px;
line-height: 22px;
letter-spacing: 0px;
z-index: 1;
}
+
.site-footer-bottom a {
color: #606483;
text-decoration: none;
}
+
.site-footer-bottom a:hover,
.site-footer-bottom a:active {
text-decoration: underline;
}
+
.site-footer-inner {
position: relative;
display: flex;
@@ -1503,6 +1821,7 @@ main {
padding-bottom: 48px;
position: relative;
}
+
.footer-brand,
.footer-links,
.footer-social-links,
@@ -1512,21 +1831,26 @@ main {
display: inline-flex;
justify-content: center;
}
+
.footer-brand,
.footer-links,
.footer-social-links {
margin-bottom: 24px;
}
+
.footer-links li + li,
.footer-social-links li + li {
margin-left: 16px;
}
+
.footer-social-links li {
display: inline-flex;
}
+
.footer-social-links li a {
padding: 8px;
}
+
@media (min-width: 641px) {
.site-footer::before {
top: -152px;
@@ -1535,25 +1859,30 @@ main {
height: 582px;
background-size: 1440px 582px;
}
+
.site-footer-inner {
justify-content: space-between;
padding-top: 64px;
padding-bottom: 64px;
}
+
.footer-brand,
.footer-links,
.footer-social-links,
.footer-copyright {
flex: 50%;
}
+
.footer-brand,
.footer-copyright {
justify-content: flex-start;
}
+
.footer-links,
.footer-social-links {
justify-content: flex-end;
}
+
.footer-links {
order: 1;
margin-bottom: 0;
diff --git a/error.html b/error.html
index 1008bc87..5aa9d552 100644
--- a/error.html
+++ b/error.html
@@ -1,50 +1,50 @@
-
-
- Cannot load YouTube Music
-
-
+ .button {
+ background: #065fd4;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ color: white;
+ font: inherit;
+ text-transform: uppercase;
+ text-decoration: none;
+ border-radius: 2px;
+ font-size: 16px;
+ font-weight: normal;
+ text-align: center;
+ padding: 8px 22px;
+ display: inline-block;
+ }
+
+
-
-
-
Cannot load YouTube Music… Internet disconnected?
-
Retry
-
-
+
+
+
Cannot load YouTube Music… Internet disconnected?
+
Retry
+
+