diff --git a/app/background.js b/app/background.js
index e867660..ea1cbd1 100644
--- a/app/background.js
+++ b/app/background.js
@@ -1,6 +1,12 @@
const {app, BrowserWindow, ipcMain, Tray, Menu, session, dialog, shell, nativeTheme} = require('electron');
const {createServer} = require('./src/server');
const path = require('path');
+const arg = require('arg');
+const { exit } = require('process');
+const packageJson = require('./package.json');
+const chalk = require('chalk');
+const {Settings} = require('./src/settings');
+const fs = require('fs');
let win;
let tray;
@@ -9,12 +15,84 @@ let settings;
let shouldExit = false;
let playing = false;
+//Arguments
+const args = arg({
+ '--server': Boolean,
+ '--host': String,
+ '--port': Number,
+ '--help': Boolean,
+ '--settings': Boolean,
+ '--reset-settings': Boolean,
+ '--reset-downloads': Boolean,
+ '--log': Boolean,
+
+ '-S': '--server',
+ '-H': '--host',
+ '-h': '--help',
+ '-p': '--port'
+}, {argv: process.argv.slice(1)});
+
+executeCli();
+
//Get path to asset
function assetPath(a) {
return path.join(__dirname, 'assets', a);
}
+//Execute actions by parameters
+function executeCli() {
+ if (args['--help']) {
+ console.log(`
+${chalk.bold.blue('Freezer PC')} ${chalk.bold(`v${packageJson.version}`)} by exttex
+
+${chalk.bold('USAGE:')}
+--help, -h Prints this and exits
+--server, -S Starts in server mode
+--host, -H Override host (default: 127.0.0.1)
+--port, -p Override port (default: 10069)
+
+${chalk.bold('TOOLS:')}
+--settings Prints current settings and exits
+--log Prints server log and exits
+--reset-settings Reset settings to default
+--reset-downloads Delete downloads cache and database
+ `);
+ exit(0);
+ }
+ //Print settings and exit
+ if (args["--settings"]) {
+ let settings = new Settings();
+ settings.load();
+ console.log(JSON.stringify(settings, null, 2));
+ exit(0);
+ }
+ if (args["--reset-settings"]) {
+ fs.unlinkSync(Settings.getPath());
+ exit(0);
+ }
+ //Delete downloads db and temp
+ if (args['--reset-downloads']) {
+ fs.unlinkSync(Settings.getDownloadsDB());
+ fs.rmdirSync(Settings.getTempDownloads(), {recursive: true});
+ exit(0);
+ }
+ //Show log
+ if (args['--log']) {
+ let p = path.join(Settings.getDir(), "freezer-server.log");
+ console.log(fs.readFileSync(p, {encoding: 'utf-8'}).toString());
+ exit(0);
+ }
+}
+
async function startServer() {
+
+ //Override settings
+ let override = {};
+ if (args["--host"])
+ override['host'] = args["--host"];
+ if (args["--port"])
+ override['port'] = args["--port"];
+
settings = await createServer(true, () => {
//Server error
shouldExit = true;
@@ -26,7 +104,7 @@ async function startServer() {
message: 'Server error occured, Freezer is probably already running!',
buttons: ['Close']
});
- });
+ }, override);
}
async function createWindow() {
@@ -85,6 +163,8 @@ async function createWindow() {
//Create window
app.on('ready', async () => {
await startServer();
+ //Server mode
+ if (args['--server']) return;
createWindow();
//Create Tray
@@ -179,6 +259,12 @@ function setThumbarButtons() {
]);
}
+
+//[] button
+ipcMain.on('maximize', () => {
+ win.isMaximized() ? win.unmaximize() : win.maximize();
+});
+
//_ button in ui
ipcMain.on('minimize', () => {
win.minimize();
diff --git a/app/client/package-lock.json b/app/client/package-lock.json
index 85dc9f5..533b669 100644
--- a/app/client/package-lock.json
+++ b/app/client/package-lock.json
@@ -88,17 +88,6 @@
"requires": {
"js-yaml": "^3.13.1",
"json5": "^2.1.1"
- },
- "dependencies": {
- "json5": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
- "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- }
}
},
"@mdi/font": {
@@ -230,12 +219,6 @@
"@types/node": "*"
}
},
- "@types/color-name": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
- "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
- "dev": true
- },
"@types/connect": {
"version": "3.4.33",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz",
@@ -309,9 +292,9 @@
}
},
"@types/json-schema": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz",
- "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
+ "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
"dev": true
},
"@types/mime": {
@@ -993,9 +976,9 @@
"dev": true
},
"acorn-jsx": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
- "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+ "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
"dev": true
},
"acorn-walk": {
@@ -1026,9 +1009,9 @@
}
},
"ajv": {
- "version": "6.12.4",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
- "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"requires": {
"fast-deep-equal": "^3.1.1",
@@ -1394,9 +1377,9 @@
}
},
"base64-arraybuffer": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
- "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg="
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz",
+ "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI="
},
"base64-js": {
"version": "1.3.1",
@@ -1419,14 +1402,6 @@
"tweetnacl": "^0.14.3"
}
},
- "better-assert": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
- "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
- "requires": {
- "callsite": "1.0.0"
- }
- },
"bfj": {
"version": "6.1.2",
"resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz",
@@ -1691,6 +1666,14 @@
"base64-js": "^1.0.2",
"ieee754": "^1.1.4",
"isarray": "^1.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ }
}
},
"buffer-from": {
@@ -1893,11 +1876,6 @@
"caller-callsite": "^2.0.0"
}
},
- "callsite": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
- "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA="
- },
"callsites": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
@@ -3465,9 +3443,9 @@
"dev": true
},
"electron-to-chromium": {
- "version": "1.3.589",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.589.tgz",
- "integrity": "sha512-rQItBTFnol20HaaLm26UgSUduX7iGerwW7pEYX17MB1tI6LzFajiLV7iZ7LVcUcsN/7HrZUoCLrBauChy/IqEg==",
+ "version": "1.3.591",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.591.tgz",
+ "integrity": "sha512-ol/0WzjL4NS4Kqy9VD6xXQON91xIihDT36sYCew/G/bnd1v0/4D+kahp26JauQhgFUjrdva3kRSo7URcUmQ+qw==",
"dev": true
},
"elliptic": {
@@ -3521,54 +3499,31 @@
}
},
"engine.io-client": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.3.tgz",
- "integrity": "sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==",
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.4.tgz",
+ "integrity": "sha512-iU4CRr38Fecj8HoZEnFtm2EiKGbYZcPn3cHxqNGl/tmdWRf60KhK+9vE0JeSjgnlS/0oynEfLgKbT9ALpim0sQ==",
"requires": {
"component-emitter": "~1.3.0",
"component-inherit": "0.0.3",
- "debug": "~4.1.0",
+ "debug": "~3.1.0",
"engine.io-parser": "~2.2.0",
"has-cors": "1.1.0",
"indexof": "0.0.1",
- "parseqs": "0.0.5",
- "parseuri": "0.0.5",
+ "parseqs": "0.0.6",
+ "parseuri": "0.0.6",
"ws": "~6.1.0",
"xmlhttprequest-ssl": "~1.5.4",
"yeast": "0.1.2"
- },
- "dependencies": {
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "ws": {
- "version": "6.1.4",
- "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz",
- "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==",
- "requires": {
- "async-limiter": "~1.0.0"
- }
- }
}
},
"engine.io-parser": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz",
- "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz",
+ "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==",
"requires": {
"after": "0.8.2",
"arraybuffer.slice": "~0.0.7",
- "base64-arraybuffer": "0.1.5",
+ "base64-arraybuffer": "0.1.4",
"blob": "0.0.5",
"has-binary2": "~1.0.2"
}
@@ -3723,21 +3678,21 @@
},
"dependencies": {
"debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+ "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
"dev": true,
"requires": {
- "ms": "^2.1.1"
+ "ms": "2.1.2"
}
},
"eslint-scope": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz",
- "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
"dev": true,
"requires": {
- "esrecurse": "^4.1.0",
+ "esrecurse": "^4.3.0",
"estraverse": "^4.1.1"
}
},
@@ -3751,9 +3706,9 @@
}
},
"import-fresh": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
- "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz",
+ "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==",
"dev": true,
"requires": {
"parent-module": "^1.0.0",
@@ -3858,9 +3813,9 @@
},
"dependencies": {
"acorn": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz",
- "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==",
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true
}
}
@@ -3889,12 +3844,20 @@
}
},
"esrecurse": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
- "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
"requires": {
- "estraverse": "^4.1.0"
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
+ }
}
},
"estraverse": {
@@ -4257,14 +4220,14 @@
},
"dependencies": {
"schema-utils": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
- "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
+ "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
"dev": true,
"requires": {
- "@types/json-schema": "^7.0.4",
- "ajv": "^6.12.2",
- "ajv-keywords": "^3.4.1"
+ "@types/json-schema": "^7.0.5",
+ "ajv": "^6.12.4",
+ "ajv-keywords": "^3.5.2"
}
}
}
@@ -4693,13 +4656,6 @@
"integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==",
"requires": {
"isarray": "2.0.1"
- },
- "dependencies": {
- "isarray": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
- "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
- }
}
},
"has-cors": {
@@ -5215,12 +5171,11 @@
},
"dependencies": {
"ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "@types/color-name": "^1.1.1",
"color-convert": "^2.0.1"
}
},
@@ -5290,9 +5245,9 @@
}
},
"supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
@@ -5428,6 +5383,15 @@
"rgba-regex": "^1.0.0"
}
},
+ "is-core-module": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz",
+ "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
"is-data-descriptor": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
@@ -5647,10 +5611,9 @@
"dev": true
},
"isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "dev": true
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
},
"isexe": {
"version": "2.0.0",
@@ -5783,12 +5746,12 @@
"dev": true
},
"json5": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
- "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+ "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
"dev": true,
"requires": {
- "minimist": "^1.2.0"
+ "minimist": "^1.2.5"
}
},
"jsonfile": {
@@ -5884,6 +5847,17 @@
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^1.0.1"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ }
}
},
"locate-path": {
@@ -6449,9 +6423,9 @@
}
},
"node-releases": {
- "version": "1.1.65",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.65.tgz",
- "integrity": "sha512-YpzJOe2WFIW0V4ZkJQd/DGR/zdVwc/pI4Nl1CZrBO19FdRcSTmsuhdttw9rsTzzJLrNcSloLiBbEYx1C4f6gpA==",
+ "version": "1.1.66",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.66.tgz",
+ "integrity": "sha512-JHEQ1iWPGK+38VLB2H9ef2otU4l8s3yAMt9Xf934r6+ojCYDMHPMqvCc9TnzfeFSP1QEOeU6YZEd3+De0LTCgg==",
"dev": true
},
"normalize-package-data": {
@@ -6538,11 +6512,6 @@
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true
},
- "object-component": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
- "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE="
- },
"object-copy": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
@@ -6931,20 +6900,14 @@
}
},
"parseqs": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
- "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
- "requires": {
- "better-assert": "~1.0.0"
- }
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz",
+ "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w=="
},
"parseuri": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
- "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
- "requires": {
- "better-assert": "~1.0.0"
- }
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz",
+ "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow=="
},
"parseurl": {
"version": "1.3.3",
@@ -7942,6 +7905,12 @@
"util-deprecate": "~1.0.1"
},
"dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -8123,11 +8092,12 @@
"dev": true
},
"resolve": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
- "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz",
+ "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==",
"dev": true,
"requires": {
+ "is-core-module": "^2.0.0",
"path-parse": "^1.0.6"
}
},
@@ -8226,9 +8196,9 @@
}
},
"rxjs": {
- "version": "6.6.2",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
- "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
+ "version": "6.6.3",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz",
+ "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==",
"dev": true,
"requires": {
"tslib": "^1.9.0"
@@ -8278,14 +8248,14 @@
},
"dependencies": {
"schema-utils": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
- "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
+ "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
"dev": true,
"requires": {
- "@types/json-schema": "^7.0.4",
- "ajv": "^6.12.2",
- "ajv-keywords": "^3.4.1"
+ "@types/json-schema": "^7.0.5",
+ "ajv": "^6.12.4",
+ "ajv-keywords": "^3.5.2"
}
}
}
@@ -8708,74 +8678,31 @@
}
},
"socket.io-client": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz",
- "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==",
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.1.tgz",
+ "integrity": "sha512-YXmXn3pA8abPOY//JtYxou95Ihvzmg8U6kQyolArkIyLd0pgVhrfor/iMsox8cn07WCOOvvuJ6XKegzIucPutQ==",
"requires": {
"backo2": "1.0.2",
- "base64-arraybuffer": "0.1.5",
"component-bind": "1.0.0",
- "component-emitter": "1.2.1",
- "debug": "~4.1.0",
+ "component-emitter": "~1.3.0",
+ "debug": "~3.1.0",
"engine.io-client": "~3.4.0",
"has-binary2": "~1.0.2",
- "has-cors": "1.1.0",
"indexof": "0.0.1",
- "object-component": "0.0.3",
- "parseqs": "0.0.5",
- "parseuri": "0.0.5",
+ "parseqs": "0.0.6",
+ "parseuri": "0.0.6",
"socket.io-parser": "~3.3.0",
"to-array": "0.1.4"
- },
- "dependencies": {
- "component-emitter": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
- "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "isarray": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
- "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "socket.io-parser": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz",
- "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==",
- "requires": {
- "component-emitter": "1.2.1",
- "debug": "~3.1.0",
- "isarray": "2.0.1"
- },
- "dependencies": {
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- }
+ }
+ },
+ "socket.io-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.1.tgz",
+ "integrity": "sha512-1QLvVAe8dTz+mKmZ07Swxt+LAo4Y1ff50rlyoEx00TQmDFVQYPfcqGvIDJLGaBdhdNCecXtyKpD+EgKGcmmbuQ==",
+ "requires": {
+ "component-emitter": "~1.3.0",
+ "debug": "~3.1.0",
+ "isarray": "2.0.1"
}
},
"sockjs": {
@@ -8838,6 +8765,11 @@
"is-plain-obj": "^1.0.0"
}
},
+ "sortablejs": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.2.tgz",
+ "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A=="
+ },
"source-list-map": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
@@ -9597,9 +9529,9 @@
"dev": true
},
"tslib": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
- "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
"dev": true
},
"tty-browserify": {
@@ -9775,6 +9707,12 @@
"resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
"integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
"dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
}
}
},
@@ -9791,9 +9729,9 @@
"dev": true
},
"uri-js": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
- "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
+ "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==",
"dev": true,
"requires": {
"punycode": "^2.1.0"
@@ -9917,9 +9855,9 @@
"dev": true
},
"v8-compile-cache": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
- "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz",
+ "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==",
"dev": true
},
"validate-npm-package-license": {
@@ -10039,9 +9977,9 @@
"integrity": "sha512-jAJ7cmv363JkZ8CxXzAzcp5k7E4L/eh92hTZUllHvPFOVGyFb5glNumBQbJGoIgpVUQ6jF/6cESnq1oPic3JxQ=="
},
"vue-eslint-parser": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.1.0.tgz",
- "integrity": "sha512-Kr21uPfthDc63nDl27AGQEhtt9VrZ9nkYk/NTftJ2ws9XiJwzJJCnCr3AITQ2jpRMA0XPGDECxYH8E027qMK9Q==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.1.1.tgz",
+ "integrity": "sha512-8FdXi0gieEwh1IprIBafpiJWcApwrU+l2FEj8c1HtHFdNXMd0+2jUSjBVmcQYohf/E72irwAXEXLga6TQcB3FA==",
"dev": true,
"requires": {
"debug": "^4.1.1",
@@ -10053,21 +9991,21 @@
},
"dependencies": {
"debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+ "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
"dev": true,
"requires": {
- "ms": "^2.1.1"
+ "ms": "2.1.2"
}
},
"eslint-scope": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz",
- "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
"dev": true,
"requires": {
- "esrecurse": "^4.1.0",
+ "esrecurse": "^4.3.0",
"estraverse": "^4.1.1"
}
},
@@ -10219,9 +10157,9 @@
}
},
"vue-loader-v16": {
- "version": "npm:vue-loader@16.0.0-rc.0",
- "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.0.0-rc.0.tgz",
- "integrity": "sha512-S4F7jhBQFuJbLtyjfrMYl4gBFhMACHtkZ+rJuH6/hvgxeAEAPBY5aVKn1+LuVE9+U1RGGQ9Nq/7DSR72spf0PQ==",
+ "version": "npm:vue-loader@16.0.0-rc.1",
+ "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.0.0-rc.1.tgz",
+ "integrity": "sha512-yR+BS90EOXTNieasf8ce9J3TFCpm2DGqoqdbtiwQ33hon3FyIznLX7sKavAq1VmfBnOeV6It0Htg4aniv8ph1g==",
"dev": true,
"optional": true,
"requires": {
@@ -10275,16 +10213,6 @@
"dev": true,
"optional": true
},
- "json5": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
- "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
- "dev": true,
- "optional": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- },
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
@@ -10356,6 +10284,14 @@
"integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
"dev": true
},
+ "vuedraggable": {
+ "version": "2.24.3",
+ "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.3.tgz",
+ "integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==",
+ "requires": {
+ "sortablejs": "1.10.2"
+ }
+ },
"vuetify": {
"version": "2.3.16",
"resolved": "https://registry.npmjs.org/vuetify/-/vuetify-2.3.16.tgz",
@@ -10841,6 +10777,15 @@
}
}
},
+ "ws": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
+ "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
+ "dev": true,
+ "requires": {
+ "async-limiter": "~1.0.0"
+ }
+ },
"yargs": {
"version": "13.3.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
@@ -11006,10 +10951,9 @@
}
},
"ws": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
- "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
- "dev": true,
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz",
+ "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==",
"requires": {
"async-limiter": "~1.0.0"
}
diff --git a/app/client/package.json b/app/client/package.json
index 2316374..a3bf318 100644
--- a/app/client/package.json
+++ b/app/client/package.json
@@ -18,6 +18,7 @@
"vue-i18n": "^8.17.3",
"vue-router": "^3.4.9",
"vue-socket.io": "^3.0.10",
+ "vuedraggable": "^2.24.3",
"vuetify": "^2.3.16"
},
"devDependencies": {
diff --git a/app/client/src/App.vue b/app/client/src/App.vue
index 0fe1019..178b292 100644
--- a/app/client/src/App.vue
+++ b/app/client/src/App.vue
@@ -10,9 +10,10 @@
height='28'>
- Freezer v{{version}}
+ Freezer v{{version}}
mdi-window-minimize
+ mdi-window-maximize
mdi-close
@@ -408,6 +409,10 @@ export default {
minimize() {
const {ipcRenderer} = window.require('electron');
ipcRenderer.send('minimize');
+ },
+ maximize() {
+ const {ipcRenderer} = window.require('electron');
+ ipcRenderer.send('maximize');
}
},
computed: {
diff --git a/app/client/src/components/AlbumTile.vue b/app/client/src/components/AlbumTile.vue
index 5991128..384d831 100644
--- a/app/client/src/components/AlbumTile.vue
+++ b/app/client/src/components/AlbumTile.vue
@@ -54,6 +54,15 @@
{{$t("Remove from library")}}
+
+
+
+ mdi-share-variant
+
+
+ {{$t("Share")}}
+
+
@@ -167,6 +176,16 @@ export default {
}
this.album.tracks = tracks;
this.downloadDialog = true;
+ },
+ //Copy link
+ share() {
+ let copyElem = document.createElement('input');
+ copyElem.value = `https://deezer.com/album/${this.album.id}`;
+ document.body.appendChild(copyElem);
+ copyElem.select();
+ document.execCommand('copy');
+ document.body.removeChild(copyElem);
+ this.$root.globalSnackbar = this.$t('Link copied!');
}
}
};
diff --git a/app/client/src/components/ArtistTile.vue b/app/client/src/components/ArtistTile.vue
index 3d3ec70..5009781 100644
--- a/app/client/src/components/ArtistTile.vue
+++ b/app/client/src/components/ArtistTile.vue
@@ -26,7 +26,7 @@
{{$t("Add to library")}}
-
+
mdi-heart-remove
@@ -35,6 +35,15 @@
{{$t("Remove from library")}}
+
+
+
+ mdi-share-variant
+
+
+ {{$t("Share")}}
+
+
@@ -97,6 +106,16 @@ export default {
query: {artist: JSON.stringify(this.artist)}
});
this.$emit('clicked');
+ },
+ //Copy link
+ share() {
+ let copyElem = document.createElement('input');
+ copyElem.value = `https://deezer.com/artist/${this.artist.id}`;
+ document.body.appendChild(copyElem);
+ copyElem.select();
+ document.execCommand('copy');
+ document.body.removeChild(copyElem);
+ this.$root.globalSnackbar = this.$t('Link copied!');
}
}
}
diff --git a/app/client/src/components/DownloadDialog.vue b/app/client/src/components/DownloadDialog.vue
index 7913d23..5db08dc 100644
--- a/app/client/src/components/DownloadDialog.vue
+++ b/app/client/src/components/DownloadDialog.vue
@@ -54,12 +54,12 @@ export default {
return {
shown: true,
qualities: [
- 'Settings quality',
+ this.$t('Settings quality'),
'MP3 128kbps',
'MP3 320kbps',
'FLAC ~1441kbps'
],
- qualityString: 'Settings quality',
+ qualityString: this.$t('Settings quality'),
autostart: true,
dShow: this.show
}
diff --git a/app/client/src/components/LibraryAlbums.vue b/app/client/src/components/LibraryAlbums.vue
index ceafff4..ba18a50 100644
--- a/app/client/src/components/LibraryAlbums.vue
+++ b/app/client/src/components/LibraryAlbums.vue
@@ -5,6 +5,23 @@
+
+
+
+ {{albums.length}} {{$t("Albums")}}
+
+
+
+
+
+
+
+ mdi-sort-reverse-variant
+ mdi-sort-variant
+
+
+
+
@@ -20,7 +37,16 @@ export default {
data() {
return {
albums: [],
- loading: false
+ loading: false,
+
+ //Sort
+ isReversed: false,
+ sortTypes: [
+ this.$t('Date Added'),
+ this.$t('Name (A-Z)'),
+ this.$t('Artist (A-Z)')
+ ],
+ unsorted: null
}
},
methods: {
@@ -35,7 +61,35 @@ export default {
},
removed(index) {
this.albums.splice(index, 1);
- }
+ },
+ //Sort changed
+ async sort(type) {
+ let index = this.sortTypes.indexOf(type);
+ //Copy original
+ if (!this.unsorted)
+ this.unsorted = JSON.parse(JSON.stringify(this.albums));
+
+ //Using indexes, so it can be translated later
+ this.isReversed = false;
+ switch (index) {
+ //Default
+ case 0:
+ this.albums = JSON.parse(JSON.stringify(this.unsorted));
+ break;
+ //Name
+ case 1:
+ this.albums = this.albums.sort((a, b) => {return a.title.localeCompare(b.title);});
+ break;
+ //Artist
+ case 2:
+ this.albums = this.albums.sort((a, b) => {return a.artistString.localeCompare(b.artistString);});
+ break;
+ }
+ },
+ async reverseSort() {
+ this.isReversed = !this.isReversed;
+ this.albums.reverse();
+ },
},
components: {
AlbumTile
diff --git a/app/client/src/components/LibraryArtists.vue b/app/client/src/components/LibraryArtists.vue
index ce45428..813804a 100644
--- a/app/client/src/components/LibraryArtists.vue
+++ b/app/client/src/components/LibraryArtists.vue
@@ -5,6 +5,23 @@
+
+
+
+ {{artists.length}} {{$t("Artists")}}
+
+
+
+
+
+
+
+ mdi-sort-reverse-variant
+ mdi-sort-variant
+
+
+
+
@@ -23,7 +40,15 @@ export default {
data() {
return {
artists: [],
- loading: false
+ loading: false,
+
+ //Sort
+ isReversed: false,
+ sortTypes: [
+ this.$t('Date Added'),
+ this.$t('Name (A-Z)')
+ ],
+ unsorted: null
}
},
methods: {
@@ -38,6 +63,30 @@ export default {
},
removed(index) {
this.artists.splice(index, 1);
+ },
+ //Sort changed
+ async sort(type) {
+ let index = this.sortTypes.indexOf(type);
+ //Copy original
+ if (!this.unsorted)
+ this.unsorted = JSON.parse(JSON.stringify(this.artists));
+
+ //Using indexes, so it can be translated later
+ this.isReversed = false;
+ switch (index) {
+ //Default
+ case 0:
+ this.artists = JSON.parse(JSON.stringify(this.unsorted));
+ break;
+ //Name
+ case 1:
+ this.artists = this.artists.sort((a, b) => {return a.name.localeCompare(b.name);});
+ break;
+ }
+ },
+ async reverseSort() {
+ this.isReversed = !this.isReversed;
+ this.artists.reverse();
}
},
mounted() {
diff --git a/app/client/src/components/LibraryPlaylists.vue b/app/client/src/components/LibraryPlaylists.vue
index a78eeec..6417cdc 100644
--- a/app/client/src/components/LibraryPlaylists.vue
+++ b/app/client/src/components/LibraryPlaylists.vue
@@ -5,17 +5,36 @@
-
-
- mdi-playlist-plus
- {{$t("Create new playlist")}}
-
+
+
+
+ mdi-playlist-plus
+ {{$t("Create new playlist")}}
+
+
+
+
+
+ {{playlists.length}} {{$t("Playlists")}}
+
+
+
+
+
+
+
+ mdi-sort-reverse-variant
+ mdi-sort-variant
+
+
+
+
+
-
@@ -36,7 +55,15 @@ export default {
return {
playlists: [],
loading: false,
- popup: false
+ popup: false,
+
+ //Sort
+ isReversed: false,
+ sortTypes: [
+ this.$t('Date Added'),
+ this.$t('Name (A-Z)'),
+ ],
+ unsorted: null
}
},
methods: {
@@ -59,7 +86,31 @@ export default {
//On playlist remove
removed(i) {
this.playlists.splice(i, 1);
- }
+ },
+ //Sort changed
+ async sort(type) {
+ let index = this.sortTypes.indexOf(type);
+ //Copy original
+ if (!this.unsorted)
+ this.unsorted = JSON.parse(JSON.stringify(this.playlists));
+
+ //Using indexes, so it can be translated later
+ this.isReversed = false;
+ switch (index) {
+ //Default
+ case 0:
+ this.playlists = JSON.parse(JSON.stringify(this.unsorted));
+ break;
+ //Name
+ case 1:
+ this.playlists = this.playlists.sort((a, b) => {return a.title.localeCompare(b.title);});
+ break;
+ }
+ },
+ async reverseSort() {
+ this.isReversed = !this.isReversed;
+ this.playlists.reverse();
+ },
},
mounted() {
//Initial load
diff --git a/app/client/src/components/PlaylistTile.vue b/app/client/src/components/PlaylistTile.vue
index 9757657..af36185 100644
--- a/app/client/src/components/PlaylistTile.vue
+++ b/app/client/src/components/PlaylistTile.vue
@@ -55,6 +55,16 @@
{{$t('Remove from library')}}
+
+
+
+
+ mdi-share-variant
+
+
+ {{$t("Share")}}
+
+
@@ -172,6 +182,16 @@ export default {
await this.$axios.put(`/library/playlist?id=${this.playlist.id}`);
this.$root.globalSnackbar = this.$t('Added to library!');
this.playlist.library = true;
+ },
+ //Copy link
+ share() {
+ let copyElem = document.createElement('input');
+ copyElem.value = `https://deezer.com/playlist/${this.playlist.id}`;
+ document.body.appendChild(copyElem);
+ copyElem.select();
+ document.execCommand('copy');
+ document.body.removeChild(copyElem);
+ this.$root.globalSnackbar = this.$t('Link copied!');
}
},
computed: {
diff --git a/app/client/src/components/TrackTile.vue b/app/client/src/components/TrackTile.vue
index 4daa1bb..3a2fc23 100644
--- a/app/client/src/components/TrackTile.vue
+++ b/app/client/src/components/TrackTile.vue
@@ -1,5 +1,5 @@
-
+
@@ -93,6 +93,15 @@
{{$t("Remove from playlist")}}
+
+
+
+ mdi-share-variant
+
+
+ {{$t("Share")}}
+
+
@@ -174,6 +183,10 @@ export default {
type: String,
default: null
},
+ ripple: {
+ type: Boolean,
+ default: true
+ }
},
methods: {
//Add track next to queue
@@ -231,6 +244,16 @@ export default {
};
this.$root.replaceQueue(res.data);
this.$root.playIndex(0);
+ },
+ //Copy link
+ share() {
+ let copyElem = document.createElement('input');
+ copyElem.value = `https://deezer.com/track/${this.track.id}`;
+ document.body.appendChild(copyElem);
+ copyElem.select();
+ document.execCommand('copy');
+ document.body.removeChild(copyElem);
+ this.$root.globalSnackbar = this.$t('Link copied!');
}
}
}
diff --git a/app/client/src/locales/ar.json b/app/client/src/locales/ar.json
index fefcb15..e92a071 100644
--- a/app/client/src/locales/ar.json
+++ b/app/client/src/locales/ar.json
@@ -127,6 +127,12 @@
"Removed from library!": "الإزالة من المكتبة!",
"Removed from playlist!": "تمت الإزالة من قائمة التشغيل!",
"Playlist deleted!": "تم حذف قائمة التشغيل!",
- "Delete": "Delete",
- "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?"
+ "Delete": "حذف",
+ "Are you sure you want to delete this playlist?": "هل أنت متأكد من أنك تريد حذف قائمة التشغيل هذه؟",
+ "Force white tray icon": "فرض أيقونة شريط المهام البيضاء",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "فرض ايقونة شريط المهام (البيضاء) الافتراضية إذا تم الكشف عن الثيم بشكل غير صحيح. يتطلب إعادة التشغيل.",
+ "Share": "مشاركة",
+ "Settings quality": "جودة الإعدادات",
+ "Content language": "لغة المحتوى",
+ "Content country": "بلد المحتوى"
}
\ No newline at end of file
diff --git a/app/client/src/locales/de.json b/app/client/src/locales/de.json
index 2d58dd1..0d162a0 100644
--- a/app/client/src/locales/de.json
+++ b/app/client/src/locales/de.json
@@ -128,5 +128,11 @@
"Removed from playlist!": "Aus der Wiedergabeliste entfernt!",
"Playlist deleted!": "Wiedergabeliste gelöscht!",
"Delete": "Löschen",
- "Are you sure you want to delete this playlist?": "Bist du sicher, dass du diese Wiedergabeliste löschen willst?"
+ "Are you sure you want to delete this playlist?": "Bist du sicher, dass du diese Wiedergabeliste löschen willst?",
+ "Force white tray icon": "Erzwinge weißes Tray-Icon",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Standardsymbol (weiß) in der Kontrollleiste erzwingen, wenn Design falsch erkannt wurde. Neustart erforderlich.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/locales/el.json b/app/client/src/locales/el.json
index a301842..ef82ef7 100644
--- a/app/client/src/locales/el.json
+++ b/app/client/src/locales/el.json
@@ -127,6 +127,12 @@
"Removed from library!": "Καταργήθηκε από τη βιβλιοθήκη!",
"Removed from playlist!": "Καταργήθηκε από τη λίστα αναπαραγωγής!",
"Playlist deleted!": "Η λίστα αναπαραγωγής διαγράφηκε!",
- "Delete": "Delete",
- "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?"
+ "Delete": "Διαγραφή",
+ "Are you sure you want to delete this playlist?": "Είστε βέβαιοι ότι θέλετε να διαγράψετε την λίστα αναπαραγωγής;",
+ "Force white tray icon": "Εξαναγκασμός λευκού εικονιδίου",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Επαναφορά προεπιλογής (λευκού) εικονιδίου σε περίπτωση σφάλματος θέματος. Απαιτείται επανεκκίνηση.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/locales/en.json b/app/client/src/locales/en.json
index d963c5d..daf2b78 100644
--- a/app/client/src/locales/en.json
+++ b/app/client/src/locales/en.json
@@ -130,5 +130,9 @@
"Delete": "Delete",
"Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?",
"Force white tray icon": "Force white tray icon",
- "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Force default (white) tray icon if theme incorrectly detected. Requires restart."
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Force default (white) tray icon if theme incorrectly detected. Requires restart.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/locales/es.json b/app/client/src/locales/es.json
index 1e69cdf..b0acb10 100644
--- a/app/client/src/locales/es.json
+++ b/app/client/src/locales/es.json
@@ -128,5 +128,11 @@
"Removed from playlist!": "¡Eliminado de la lista de reproducción!",
"Playlist deleted!": "¡Lista de reproducción eliminada!",
"Delete": "Eliminar",
- "Are you sure you want to delete this playlist?": "¿Está seguro de querer eliminar la lista de reproducción?"
+ "Are you sure you want to delete this playlist?": "¿Está seguro de querer eliminar la lista de reproducción?",
+ "Force white tray icon": "Forzar icono blanco en la bandeja",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Forzar icono predeterminado en bandeja (blanco) si el tema no es detectado correctamente. Requiere reinicio.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/locales/fa.json b/app/client/src/locales/fa.json
index 70d97dd..daf2b78 100644
--- a/app/client/src/locales/fa.json
+++ b/app/client/src/locales/fa.json
@@ -128,5 +128,11 @@
"Removed from playlist!": "Removed from playlist!",
"Playlist deleted!": "Playlist deleted!",
"Delete": "Delete",
- "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?"
+ "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?",
+ "Force white tray icon": "Force white tray icon",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Force default (white) tray icon if theme incorrectly detected. Requires restart.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/locales/fil.json b/app/client/src/locales/fil.json
index a4b9c51..2edeaff 100644
--- a/app/client/src/locales/fil.json
+++ b/app/client/src/locales/fil.json
@@ -128,5 +128,11 @@
"Removed from playlist!": "Removed from playlist!",
"Playlist deleted!": "Playlist deleted!",
"Delete": "Delete",
- "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?"
+ "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?",
+ "Force white tray icon": "Force white tray icon",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Force default (white) tray icon if theme incorrectly detected. Requires restart.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/locales/fr.json b/app/client/src/locales/fr.json
index 79c8d3c..325f108 100644
--- a/app/client/src/locales/fr.json
+++ b/app/client/src/locales/fr.json
@@ -55,7 +55,7 @@
"Queue": "File d'attente",
"Total": "Total",
"Stop": "Arrêter",
- "Start": "Début",
+ "Start": "Lancer",
"Show folder": "Afficher le dossier",
"Clear queue": "Effacer la liste d'attente",
"Playing from": "Lecture depuis",
@@ -128,5 +128,11 @@
"Removed from playlist!": "Supprimé de la playlist !",
"Playlist deleted!": "Playlist supprimée !",
"Delete": "Supprimer",
- "Are you sure you want to delete this playlist?": "Voulez-vous vraiment supprimer cette liste de lecture ?"
+ "Are you sure you want to delete this playlist?": "Voulez-vous vraiment supprimer cette liste de lecture ?",
+ "Force white tray icon": "Forcer l'icône blanche dans la zone de notification",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Forcer l'icône blanche par défaut dans la zone de notification si le thème n'est pas correctement détecté. Nécessite un redémarrage.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/locales/he.json b/app/client/src/locales/he.json
index 70d97dd..daf2b78 100644
--- a/app/client/src/locales/he.json
+++ b/app/client/src/locales/he.json
@@ -128,5 +128,11 @@
"Removed from playlist!": "Removed from playlist!",
"Playlist deleted!": "Playlist deleted!",
"Delete": "Delete",
- "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?"
+ "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?",
+ "Force white tray icon": "Force white tray icon",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Force default (white) tray icon if theme incorrectly detected. Requires restart.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/locales/hi.json b/app/client/src/locales/hi.json
index 70d97dd..daf2b78 100644
--- a/app/client/src/locales/hi.json
+++ b/app/client/src/locales/hi.json
@@ -128,5 +128,11 @@
"Removed from playlist!": "Removed from playlist!",
"Playlist deleted!": "Playlist deleted!",
"Delete": "Delete",
- "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?"
+ "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?",
+ "Force white tray icon": "Force white tray icon",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Force default (white) tray icon if theme incorrectly detected. Requires restart.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/locales/hr.json b/app/client/src/locales/hr.json
index 70d97dd..daf2b78 100644
--- a/app/client/src/locales/hr.json
+++ b/app/client/src/locales/hr.json
@@ -128,5 +128,11 @@
"Removed from playlist!": "Removed from playlist!",
"Playlist deleted!": "Playlist deleted!",
"Delete": "Delete",
- "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?"
+ "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?",
+ "Force white tray icon": "Force white tray icon",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Force default (white) tray icon if theme incorrectly detected. Requires restart.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/locales/hu.json b/app/client/src/locales/hu.json
index 8f13d6e..51e3baa 100644
--- a/app/client/src/locales/hu.json
+++ b/app/client/src/locales/hu.json
@@ -128,5 +128,11 @@
"Removed from playlist!": "Removed from playlist!",
"Playlist deleted!": "Playlist deleted!",
"Delete": "Delete",
- "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?"
+ "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?",
+ "Force white tray icon": "Force white tray icon",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Force default (white) tray icon if theme incorrectly detected. Requires restart.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/locales/id.json b/app/client/src/locales/id.json
index f07ad42..44c4fe0 100644
--- a/app/client/src/locales/id.json
+++ b/app/client/src/locales/id.json
@@ -128,5 +128,11 @@
"Removed from playlist!": "Dihapus dari daftar putar!",
"Playlist deleted!": "Daftar putar dihapus!",
"Delete": "Hapus",
- "Are you sure you want to delete this playlist?": "Apakah kamu yakin ingin menghapus daftar putar ini?"
+ "Are you sure you want to delete this playlist?": "Apakah kamu yakin ingin menghapus daftar putar ini?",
+ "Force white tray icon": "Force white tray icon",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Force default (white) tray icon if theme incorrectly detected. Requires restart.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/locales/it.json b/app/client/src/locales/it.json
index e1a8aa7..d861295 100644
--- a/app/client/src/locales/it.json
+++ b/app/client/src/locales/it.json
@@ -110,23 +110,29 @@
"Settings saved!": "Impostazioni salvate!",
"Available only in Electron version!": "Disponibile solo nella versione Electron!",
"Crossfade (ms)": "Dissolvenza (ms)",
- "Select primary color": "Select primary color",
- "Light theme": "Light theme",
- "Create folders for playlists": "Create folders for playlists",
+ "Select primary color": "Seleziona colore principale",
+ "Light theme": "Tema chiaro",
+ "Create folders for playlists": "Crea cartelle per le playlist",
"About": "About",
- "Links:": "Links:",
+ "Links:": "Link:",
"Telegram Releases": "Telegram Releases",
- "Telegram Group": "Telegram Group",
+ "Telegram Group": "Gruppo Telegram",
"Discord": "Discord",
- "Telegram Android Group": "Telegram Android Group",
- "Credits:": "Credits:",
- "Agree": "Agree",
- "Dismiss": "Dismiss",
- "Added to playlist!": "Added to playlist!",
- "Added to library!": "Added to library!",
- "Removed from library!": "Removed from library!",
- "Removed from playlist!": "Removed from playlist!",
- "Playlist deleted!": "Playlist deleted!",
- "Delete": "Delete",
- "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?"
+ "Telegram Android Group": "Gruppo Telegram Android",
+ "Credits:": "Crediti:",
+ "Agree": "Accetta",
+ "Dismiss": "Rifiuta",
+ "Added to playlist!": "Aggiunto alla playlist!",
+ "Added to library!": "Aggiunto alla libreria!",
+ "Removed from library!": "Rimosso dalla libreria!",
+ "Removed from playlist!": "Rimosso dalla playlist!",
+ "Playlist deleted!": "Playlist eliminata!",
+ "Delete": "Elimina",
+ "Are you sure you want to delete this playlist?": "Sei sicuro di voler eliminare questa playlist?",
+ "Force white tray icon": "Force white tray icon",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Force default (white) tray icon if theme incorrectly detected. Requires restart.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/locales/ko.json b/app/client/src/locales/ko.json
index 70d97dd..daf2b78 100644
--- a/app/client/src/locales/ko.json
+++ b/app/client/src/locales/ko.json
@@ -128,5 +128,11 @@
"Removed from playlist!": "Removed from playlist!",
"Playlist deleted!": "Playlist deleted!",
"Delete": "Delete",
- "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?"
+ "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?",
+ "Force white tray icon": "Force white tray icon",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Force default (white) tray icon if theme incorrectly detected. Requires restart.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/locales/pl.json b/app/client/src/locales/pl.json
index 372a2a3..e49f2cf 100644
--- a/app/client/src/locales/pl.json
+++ b/app/client/src/locales/pl.json
@@ -128,5 +128,11 @@
"Removed from playlist!": "Usunięto z playlisty!",
"Playlist deleted!": "Playlista została usunięta!",
"Delete": "Delete",
- "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?"
+ "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?",
+ "Force white tray icon": "Force white tray icon",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Force default (white) tray icon if theme incorrectly detected. Requires restart.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/locales/pt.json b/app/client/src/locales/pt.json
index 72077b9..41e8bd2 100644
--- a/app/client/src/locales/pt.json
+++ b/app/client/src/locales/pt.json
@@ -6,34 +6,34 @@
"Playlists": "Playlists",
"Albums": "Álbuns",
"Artists": "Artistas",
- "More": "More",
+ "More": "Mais",
"Settings": "Configurações",
"Downloads": "Downloads",
- "Search or paste Deezer URL. Use / to quickly focus.": "Procure ou cole a URL do intérprete. Use \"/\" para focar rapidamente.",
- "Play": "Play",
+ "Search or paste Deezer URL. Use / to quickly focus.": "Procure ou cole a URL do Deezer. Use \"/\" para focar rapidamente.",
+ "Play": "Reproduzir",
"Add to library": "Adicionar à biblioteca",
"Download": "Download",
"fans": "fans",
"tracks": "faixas",
"Quality": "Qualidade",
"Estimated size:": "Tempo estimado:",
- "Start downloading": "Iniciar download",
+ "Start downloading": "Começar a baixar",
"Cancel": "Cancelar",
"Stream logging is disabled!": "O registro de depuração extra está desativado!",
"Enable it in settings for history to work properly.": "Habilite nas configurações para que o histórico funcione corretamente.",
"History": "Histórico",
"Create new playlist": "Criar nova playlist",
"TRACKS": "FAIXAS",
- "Sort by": "Sort by",
+ "Sort by": "Ordenar por",
"Date Added": "Data de adição",
"Name (A-Z)": "Nome (A-Z)",
"Artist (A-Z)": "Artista (A-Z)",
"Album (A-Z)": "Álbum (A-Z)",
- "Error loading lyrics or lyrics not found!": "Erro ao carregar letras ou letras não encontradas!",
+ "Error loading lyrics or lyrics not found!": "Erro ao carregar letra ou letra não encontrada!",
"Create playlist": "Criar playlist",
"Create": "Criar",
"Add to playlist": "Adicionar à playlist",
- "Create new": "Criar novo",
+ "Create new": "Criar nova",
"Remove": "Remover",
"Play next": "Reproduzir à seguir",
"Add to queue": "Adicionar à fila",
@@ -49,7 +49,7 @@
"Play top": "Reproduzir no topo",
"Radio": "Rádio",
"Show all albums": "Mostrar todos os álbuns",
- "Show all singles": "Mostrar todas as músicas",
+ "Show all singles": "Mostrar todos os singles",
"Show more": "Mostrar mais",
"Downloaded": "Baixados",
"Queue": "Fila de Reprodução",
@@ -60,52 +60,52 @@
"Clear queue": "Limpar lista",
"Playing from": "Reproduzindo de",
"Info": "Informações",
- "Lyrics": "Letras",
+ "Lyrics": "Letra",
"Track number": "Número de faixa",
"Disk number": "Numero de disco",
- "Explicit": "Explicito",
+ "Explicit": "Explícito",
"Source": "Fonte",
"ID": "Identificação",
"Error logging in!": "Erro de login!",
"Please try again later, or try another account.": "Por favor, tente novamente mais tarde ou tente outra conta.",
- "Logout": "Encerrar sessão",
+ "Logout": "Desconectar",
"Login using browser": "Login usando o navegador",
"Please login using your Deezer account:": "Faça login usando sua conta do Deezer:",
"...or paste your ARL/Token below:": "...ou cole seu ARL/Token abaixo:",
"ARL/Token": "ARL/Token",
"Login": "Login",
- "By using this program, you disagree with Deezer's ToS.": "Ao usar este programa, você discorda do Acordo de Assinatura do Deezer.",
+ "By using this program, you disagree with Deezer's ToS.": "Ao usar este programa, você discorda dos termos e condições de uso do Deezer.",
"Only in Electron version!": "Apenas na versão do Electron!",
"Search results for:": "Buscar resultados para:",
- "Error loading data!": "Error loading data!",
- "Try again later!": "Try again later!",
- "Search": "Search",
- "Streaming Quality": "Streaming Quality",
- "Download Quality": "Download Quality",
- "Downloads Directory": "Downloads Directory",
- "Simultaneous downloads": "Simultaneous downloads",
- "Always show download confirm dialog before downloading.": "Always show download confirm dialog before downloading.",
- "Show download dialog": "Show download dialog",
- "Create folders for artists": "Create folders for artists",
- "Create folders for albums": "Create folders for albums",
- "Download lyrics": "Download lyrics",
- "Variables": "Variables",
- "UI": "UI",
- "Show autocomplete in search": "Show autocomplete in search",
- "Integrations": "Integrations",
- "This allows listening history, flow and recommendations to work properly.": "This allows listening history, flow and recommendations to work properly.",
- "Log track listens to Deezer": "Log track listens to Deezer",
- "Connect your LastFM account to allow scrobbling.": "Connect your LastFM account to allow scrobbling.",
- "Login with LastFM": "Login with LastFM",
- "Disconnect LastFM": "Disconnect LastFM",
+ "Error loading data!": "Erro ao carregar dados!",
+ "Try again later!": "Tente novamente mais tarde!",
+ "Search": "Busca",
+ "Streaming Quality": "Qualidade do streaming",
+ "Download Quality": "Qualiadade do download",
+ "Downloads Directory": "Pasta de Download",
+ "Simultaneous downloads": "Downloads simultâneos",
+ "Always show download confirm dialog before downloading.": "Sempre mostrar diálogo de confirmação de download antes de baixar.",
+ "Show download dialog": "Mostrar diálogo de download",
+ "Create folders for artists": "Criar pastas para artistas",
+ "Create folders for albums": "Criar pastas para álbuns",
+ "Download lyrics": "Baixar letra",
+ "Variables": "Variáveis",
+ "UI": "IU",
+ "Show autocomplete in search": "Mostrar autocompletar na busca",
+ "Integrations": "Integrações",
+ "This allows listening history, flow and recommendations to work properly.": "Isto permite que o histórico de ouvidas, flow e recomendações funcionem corretamente.",
+ "Log track listens to Deezer": "Log de faixas ouvidas para o Deezer",
+ "Connect your LastFM account to allow scrobbling.": "Conecte sua conta do LastFM para permitir o scrobbling.",
+ "Login with LastFM": "Login com LastFM",
+ "Disconnect LastFM": "Desconectar LastFM",
"Requires restart to apply!": "Requer reinicialização do aplicativo para aplicar!",
"Enable Discord Rich Presence, requires restart to toggle!": "Ativar o Rich Presence do Discord, requer reiniciar para alternar!",
- "Discord Rich Presence": "Habilitar o Discord",
+ "Discord Rich Presence": "Discord Rich Presence",
"Enable Discord join button for syncing tracks, requires restart to toggle!": "Ativar o botão de adesão do Discord para sincronizar faixas requer reinicialização para alternar!",
"Discord Join Button": "Botão de Entrada Discord",
- "Other": "Outros",
+ "Other": "Outro",
"Minimize to tray": "Minimizar para a bandeja",
- "Don't minimize to tray": "Minimizar automaticamente para a bandeja",
+ "Don't minimize to tray": "Não minimizar para a bandeja",
"Close on exit": "Fechar ao sair",
"Settings saved!": "Configurações salvas!",
"Available only in Electron version!": "Disponível apenas na versão completa!",
@@ -118,15 +118,21 @@
"Telegram Releases": "Versões no Telegram",
"Telegram Group": "Grupo do Telegram",
"Discord": "Discord",
- "Telegram Android Group": "Grupo Android do Telegram",
+ "Telegram Android Group": "Grupo do Android no Telegram",
"Credits:": "Créditos:",
"Agree": "Concordo",
- "Dismiss": "Dismiss",
- "Added to playlist!": "Added to playlist!",
- "Added to library!": "Added to library!",
- "Removed from library!": "Removed from library!",
- "Removed from playlist!": "Removed from playlist!",
- "Playlist deleted!": "Playlist deleted!",
- "Delete": "Delete",
- "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?"
+ "Dismiss": "Dispensar",
+ "Added to playlist!": "Adicionar à playlist!",
+ "Added to library!": "Adicionado à biblioteca!",
+ "Removed from library!": "Removido da biblioteca!",
+ "Removed from playlist!": "Removido da playlist!",
+ "Playlist deleted!": "Playlist deletada!",
+ "Delete": "Deletar",
+ "Are you sure you want to delete this playlist?": "Você tem certeza que deseja excluir esta playlist?",
+ "Force white tray icon": "Forçar ícone de bandeja branco",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Forçar ícone de bandeja (branco) padrão se o tema for detectado incorretamente. Requer reinicialização.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/locales/ro.json b/app/client/src/locales/ro.json
index f551f66..4b05f4c 100644
--- a/app/client/src/locales/ro.json
+++ b/app/client/src/locales/ro.json
@@ -128,5 +128,11 @@
"Removed from playlist!": "Removed from playlist!",
"Playlist deleted!": "Playlist deleted!",
"Delete": "Delete",
- "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?"
+ "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?",
+ "Force white tray icon": "Force white tray icon",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Force default (white) tray icon if theme incorrectly detected. Requires restart.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/locales/ru.json b/app/client/src/locales/ru.json
index 3d793a2..930109f 100644
--- a/app/client/src/locales/ru.json
+++ b/app/client/src/locales/ru.json
@@ -120,13 +120,19 @@
"Discord": "Discord",
"Telegram Android Group": "Обсуждение Freezer Android",
"Credits:": "Благодарность:",
- "Agree": "Agree",
- "Dismiss": "Dismiss",
- "Added to playlist!": "Added to playlist!",
- "Added to library!": "Added to library!",
- "Removed from library!": "Removed from library!",
- "Removed from playlist!": "Removed from playlist!",
- "Playlist deleted!": "Playlist deleted!",
- "Delete": "Delete",
- "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?"
+ "Agree": "Согласен",
+ "Dismiss": "Отмена",
+ "Added to playlist!": "Добавлено в плейлист!",
+ "Added to library!": "Добавлено в избранное!",
+ "Removed from library!": "Удалено из Избранного!",
+ "Removed from playlist!": "Удалено из плейлиста!",
+ "Playlist deleted!": "Плейлист удален!",
+ "Delete": "Удалить",
+ "Are you sure you want to delete this playlist?": "Вы точно хотите удалить этот плейлист?",
+ "Force white tray icon": "Белый значок в трее",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Принудительно использовать белый значок, если тема определена неправильно. Требуется перезапуск.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/locales/sk.json b/app/client/src/locales/sk.json
index 73eb05f..3b5cba2 100644
--- a/app/client/src/locales/sk.json
+++ b/app/client/src/locales/sk.json
@@ -128,5 +128,11 @@
"Removed from playlist!": "Odstránené z playlistu!",
"Playlist deleted!": "Playlist odstránený!",
"Delete": "Odstrániť",
- "Are you sure you want to delete this playlist?": "Naozaj chcete odstrániť tento playlist?"
+ "Are you sure you want to delete this playlist?": "Naozaj chcete odstrániť tento playlist?",
+ "Force white tray icon": "Vynútiť bielu ikonu v lište",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Vynútiť predvolenú (bielu) ikonu v lište, ak je motív nesprávne zistený. Vyžaduje sa reštart.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/locales/tr.json b/app/client/src/locales/tr.json
index de39b3d..e56251b 100644
--- a/app/client/src/locales/tr.json
+++ b/app/client/src/locales/tr.json
@@ -128,5 +128,11 @@
"Removed from playlist!": "Removed from playlist!",
"Playlist deleted!": "Playlist deleted!",
"Delete": "Delete",
- "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?"
+ "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?",
+ "Force white tray icon": "Force white tray icon",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Force default (white) tray icon if theme incorrectly detected. Requires restart.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/locales/uk.json b/app/client/src/locales/uk.json
index 2640469..4a633e0 100644
--- a/app/client/src/locales/uk.json
+++ b/app/client/src/locales/uk.json
@@ -128,5 +128,11 @@
"Removed from playlist!": "Видалено з плейлиста!",
"Playlist deleted!": "Плейлист видалено!",
"Delete": "Видалити",
- "Are you sure you want to delete this playlist?": "Ви впевнені, що хочете видалити цей плейлист?"
+ "Are you sure you want to delete this playlist?": "Ви впевнені, що хочете видалити цей плейлист?",
+ "Force white tray icon": "Force white tray icon",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Force default (white) tray icon if theme incorrectly detected. Requires restart.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/locales/ur.json b/app/client/src/locales/ur.json
index 70d97dd..daf2b78 100644
--- a/app/client/src/locales/ur.json
+++ b/app/client/src/locales/ur.json
@@ -128,5 +128,11 @@
"Removed from playlist!": "Removed from playlist!",
"Playlist deleted!": "Playlist deleted!",
"Delete": "Delete",
- "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?"
+ "Are you sure you want to delete this playlist?": "Are you sure you want to delete this playlist?",
+ "Force white tray icon": "Force white tray icon",
+ "Force default (white) tray icon if theme incorrectly detected. Requires restart.": "Force default (white) tray icon if theme incorrectly detected. Requires restart.",
+ "Share": "Share",
+ "Settings quality": "Settings quality",
+ "Content language": "Content language",
+ "Content country": "Content country"
}
\ No newline at end of file
diff --git a/app/client/src/main.js b/app/client/src/main.js
index 0d5428d..64c349e 100644
--- a/app/client/src/main.js
+++ b/app/client/src/main.js
@@ -234,7 +234,7 @@ new Vue({
}
//Crossfade
- if (this.settings.crossfadeDuration > 0 && this.position >= (this.duration() - this.settings.crossfadeDuration) && this.state == 2 && this.gapless.audio && !this.gapless.crossfade) {
+ if (this.settings.crossfadeDuration > 0 && this.position >= (this.duration() - this.settings.crossfadeDuration) && this.state == 2 && this.gapless.audio && !this.gapless.crossfade && this.gapless.track) {
this.gapless.crossfade = true;
let currentVolume = this.audio.volume;
let oldAudio = this.audio;
@@ -249,11 +249,15 @@ new Vue({
this.configureAudio();
this.updateMediaSession();
+ this.audio.volume = 0.0;
let volumeStep = currentVolume / (this.settings.crossfadeDuration / 50);
for (let i=0; i<(this.settings.crossfadeDuration / 50); i++) {
if ((oldAudio.volume - volumeStep) > 0)
oldAudio.volume -= volumeStep;
this.audio.volume += volumeStep;
+ //Prevent going over
+ if (this.audio.volume >= currentVolume)
+ break;
await new Promise((res) => setTimeout(() => res(), 50));
}
oldAudio.pause();
@@ -355,11 +359,11 @@ new Vue({
//Reset gapless playback meta
resetGapless() {
- this.gapless = {promise: null,audio: null,info: null,track: null,index:null};
+ this.gapless = {crossfade: false,promise: null,audio: null,info: null,track: null,index:null};
},
//Load next track for gapless
async loadGapless() {
- if (this.loaders != 0 || this.gapless.promise || this.gapless.audio) return;
+ if (this.loaders != 0 || this.gapless.promise || this.gapless.audio || this.gapless.crossfade) return;
//Repeat list
if (this.repeat == 1 && this.queue.index == this.queue.data.length - 1) {
@@ -385,7 +389,7 @@ new Vue({
}
this.gapless.info = info
this.gapless.audio = new Audio(`${window.location.origin}${info.url}`);
- this.gapless.audio.volume = 0;
+ this.gapless.audio.volume = 0.00;
this.gapless.audio.preload = 'auto';
this.gapless.crossfade = false;
diff --git a/app/client/src/views/About.vue b/app/client/src/views/About.vue
index fd32676..efac39a 100644
--- a/app/client/src/views/About.vue
+++ b/app/client/src/views/About.vue
@@ -50,7 +50,7 @@
Developer
-
+
Deemix
Much better app <3
diff --git a/app/client/src/views/FullscreenPlayer.vue b/app/client/src/views/FullscreenPlayer.vue
index fc8775a..0295b58 100644
--- a/app/client/src/views/FullscreenPlayer.vue
+++ b/app/client/src/views/FullscreenPlayer.vue
@@ -11,7 +11,7 @@
-
+
mdi-download
+
+ mdi-share-variant
+
+
-
+
{{$t("Queue")}}
@@ -135,18 +139,18 @@
-
-
-
+
+
+
+
+
+
+
@@ -238,10 +242,12 @@ import PlaylistPopup from '@/components/PlaylistPopup.vue';
import Lyrics from '@/components/Lyrics.vue';
import DownloadDialog from '@/components/DownloadDialog.vue';
+import draggable from 'vuedraggable';
+
export default {
name: 'FullscreenPlayer',
components: {
- TrackTile, ArtistTile, AlbumTile, PlaylistPopup, Lyrics, DownloadDialog
+ TrackTile, ArtistTile, AlbumTile, PlaylistPopup, Lyrics, DownloadDialog, draggable
},
data() {
return {
@@ -312,6 +318,19 @@ export default {
}
//Update index
this.$root.queue.index = this.$root.queue.data.findIndex(t => t.id == this.$root.track.id);
+ },
+ //Copy link
+ share() {
+ let copyElem = document.createElement('input');
+ copyElem.value = `https://deezer.com/track/${this.$root.track.id}`;
+ document.body.appendChild(copyElem);
+ copyElem.select();
+ document.execCommand('copy');
+ document.body.removeChild(copyElem);
+ this.$root.globalSnackbar = this.$t('Link copied!');
+ },
+ queueMove() {
+ this.$root.queue.index = this.$root.queue.data.findIndex(t => t.id == this.$root.track.id);
}
},
mounted() {
diff --git a/app/client/src/views/PlaylistPage.vue b/app/client/src/views/PlaylistPage.vue
index 694213f..b1af73f 100644
--- a/app/client/src/views/PlaylistPage.vue
+++ b/app/client/src/views/PlaylistPage.vue
@@ -22,7 +22,7 @@
{{$numberString(playlist.fans)}} {{$t('fans')}}
-
+
mdi-play
{{$t('Play')}}
@@ -45,6 +45,16 @@
mdi-delete
{{$t('Delete')}}
+
+
+
+
+
+
+ mdi-sort-reverse-variant
+ mdi-sort-variant
+
+
@@ -109,7 +119,16 @@ export default {
//Add to library button
libraryLoading: false,
downloadDialog: false,
- deleteDialog: false
+ deleteDialog: false,
+
+ //Sort
+ sortTypes: [
+ this.$t('Date Added'),
+ this.$t('Name (A-Z)'),
+ this.$t('Artist (A-Z)'),
+ this.$t('Album (A-Z)')
+ ],
+ isReversed: false
}
},
methods: {
@@ -209,7 +228,45 @@ export default {
async deletePlaylist() {
await this.$axios.delete(`/playlist/${this.playlist.id}`);
this.$router.go(-1);
- }
+ },
+ //Sort changed
+ async sort(type) {
+ let index = this.sortTypes.indexOf(type);
+ //Preload all tracks
+ if (this.playlist.tracks.length < this.playlist.trackCount)
+ await this.loadAllTracks();
+ //Copy original
+ if (!this.tracksUnsorted)
+ this.tracksUnsorted = JSON.parse(JSON.stringify(this.playlist.tracks));
+
+ //Using indexes, so it can be translated later
+ this.isReversed = false;
+ switch (index) {
+ //Default
+ case 0:
+ this.tracks = JSON.parse(JSON.stringify(this.tracksUnsorted));
+ break;
+ //Name
+ case 1:
+ this.tracks = this.playlist.tracks.sort((a, b) => {return a.title.localeCompare(b.title);});
+ break;
+ //Artist
+ case 2:
+ this.tracks = this.playlist.tracks.sort((a, b) => {return a.artistString.localeCompare(b.artistString);});
+ break;
+ //Album
+ case 3:
+ this.tracks = this.playlist.tracks.sort((a, b) => {return a.album.title.localeCompare(b.album.title);});
+ break;
+ }
+ },
+ async reverseSort() {
+ //Preload tracks if not sorted yet
+ if (this.playlist.tracks.length < this.playlist.trackCount)
+ await this.sort(0);
+ this.isReversed = !this.isReversed;
+ this.tracks.reverse();
+ },
},
mounted() {
this.initialLoad();
diff --git a/app/client/src/views/Settings.vue b/app/client/src/views/Settings.vue
index 550ba19..ccc59a6 100644
--- a/app/client/src/views/Settings.vue
+++ b/app/client/src/views/Settings.vue
@@ -211,6 +211,23 @@
{{$t("Other")}}
+
+
+
+
+
+
+
@@ -283,6 +300,7 @@