1.1.7 - cli, sorting, maximize, bugs...

This commit is contained in:
exttex 2020-11-08 18:01:02 +01:00
parent 8648e6df41
commit 0a467966cb
46 changed files with 940 additions and 426 deletions

View File

@ -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();

View File

@ -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"
}

View File

@ -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": {

View File

@ -10,9 +10,10 @@
height='28'>
<v-spacer></v-spacer>
<span>Freezer <span v-if='version'>v{{version}}</span></span>
<span style='position: absolute; left: 45%'>Freezer <span v-if='version'>v{{version}}</span></span>
<v-spacer></v-spacer>
<v-icon class='topbarbutton mx-2' @click='minimize'>mdi-window-minimize</v-icon>
<v-icon class='topbarbutton mx-2' @click='maximize'>mdi-window-maximize</v-icon>
<v-icon @click='exitApp' class='topbarbutton mx-2'>mdi-close</v-icon>
</v-system-bar>
@ -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: {

View File

@ -54,6 +54,15 @@
<v-list-item-title>{{$t("Remove from library")}}</v-list-item-title>
</v-list-item-content>
</v-list-item>
<!-- Share -->
<v-list-item dense @click='share'>
<v-list-item-icon>
<v-icon>mdi-share-variant</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{$t("Share")}}</v-list-item-title>
</v-list-item-content>
</v-list-item>
<!-- Download -->
<v-list-item dense @click='download'>
<v-list-item-icon>
@ -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!');
}
}
};

View File

@ -26,7 +26,7 @@
<v-list-item-title>{{$t("Add to library")}}</v-list-item-title>
</v-list-item-content>
</v-list-item>
<!-- Remvoe from library -->
<!-- Remove from library -->
<v-list-item dense @click='library' v-if='artist.library'>
<v-list-item-icon>
<v-icon>mdi-heart-remove</v-icon>
@ -35,6 +35,15 @@
<v-list-item-title>{{$t("Remove from library")}}</v-list-item-title>
</v-list-item-content>
</v-list-item>
<!-- Share -->
<v-list-item dense @click='share'>
<v-list-item-icon>
<v-icon>mdi-share-variant</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{$t("Share")}}</v-list-item-title>
</v-list-item-content>
</v-list-item>
</v-list>
</v-menu>
@ -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!');
}
}
}

View File

@ -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
}

View File

@ -5,6 +5,23 @@
<v-progress-circular indeterminate></v-progress-circular>
</v-overlay>
<!-- Sort -->
<div class='px-4 d-flex' style='max-height: 50px;' v-if='!loading'>
<div class='text-overline pt-1 mx-2'>
{{albums.length}} {{$t("Albums")}}
</div>
<div style="max-width: 200px;" class='mx-2'>
<v-select class='px-2' dense solo :items='sortTypes' @change='sort' :label='$t("Sort by")'>
</v-select>
</div>
<div class='px-2' @click='reverseSort'>
<v-btn icon>
<v-icon v-if='isReversed'>mdi-sort-reverse-variant</v-icon>
<v-icon v-if='!isReversed'>mdi-sort-variant</v-icon>
</v-btn>
</div>
</div>
<v-lazy max-height="100" v-for='(album, index) in albums' :key='album.id'>
<AlbumTile :album='album' @remove='removed(index)'></AlbumTile>
</v-lazy>
@ -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

View File

@ -5,6 +5,23 @@
<v-progress-circular indeterminate></v-progress-circular>
</v-overlay>
<!-- Sort -->
<div class='px-4 d-flex' style='max-height: 50px;' v-if='!loading'>
<div class='text-overline pt-1 mx-2'>
{{artists.length}} {{$t("Artists")}}
</div>
<div style="max-width: 200px;" class='mx-2'>
<v-select class='px-2' dense solo :items='sortTypes' @change='sort' :label='$t("Sort by")'>
</v-select>
</div>
<div class='px-2' @click='reverseSort'>
<v-btn icon>
<v-icon v-if='isReversed'>mdi-sort-reverse-variant</v-icon>
<v-icon v-if='!isReversed'>mdi-sort-variant</v-icon>
</v-btn>
</div>
</div>
<v-lazy max-height="100" v-for='(artist, index) in artists' :key='artist.id'>
<ArtistTile :artist='artist' @remove='removed(index)'></ArtistTile>
</v-lazy>
@ -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() {

View File

@ -5,17 +5,36 @@
<v-progress-circular indeterminate></v-progress-circular>
</v-overlay>
<!-- Create playlist -->
<v-btn class='ma-2 ml-3' color='primary' @click='popup = true'>
<v-icon left>mdi-playlist-plus</v-icon>
{{$t("Create new playlist")}}
</v-btn>
<div class='d-flex'>
<!-- Create playlist -->
<v-btn class='ma-2 ml-3' color='primary' @click='popup = true'>
<v-icon left>mdi-playlist-plus</v-icon>
{{$t("Create new playlist")}}
</v-btn>
<!-- Sort -->
<div class='mt-1 px-2 d-flex'>
<div class='text-overline pt-1 mx-2'>
{{playlists.length}} {{$t("Playlists")}}
</div>
<div style="max-width: 200px;" class='mx-2'>
<v-select class='px-2' dense solo :items='sortTypes' @change='sort' :label='$t("Sort by")'>
</v-select>
</div>
<div class='px-2' @click='reverseSort'>
<v-btn icon>
<v-icon v-if='isReversed'>mdi-sort-reverse-variant</v-icon>
<v-icon v-if='!isReversed'>mdi-sort-variant</v-icon>
</v-btn>
</div>
</div>
</div>
<v-dialog max-width="400px" v-model='popup'>
<PlaylistPopup @created='playlistCreated'></PlaylistPopup>
</v-dialog>
<v-lazy max-height="100" v-for='(playlist, index) in playlists' :key='playlist.id'>
<PlaylistTile :playlist='playlist' @remove='removed(index)'></PlaylistTile>
</v-lazy>
@ -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

View File

@ -55,6 +55,16 @@
<v-list-item-title>{{$t('Remove from library')}}</v-list-item-title>
</v-list-item-content>
</v-list-item>
<!-- Share -->
<v-list-item dense @click='share'>
<v-list-item-icon>
<v-icon>mdi-share-variant</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{$t("Share")}}</v-list-item-title>
</v-list-item-content>
</v-list-item>
<!-- Download -->
<v-list-item dense @click='download'>
@ -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: {

View File

@ -1,5 +1,5 @@
<template>
<v-list-item two-line @click='$emit("click")'>
<v-list-item two-line @click='$emit("click")' :ripple='ripple'>
<v-list-item-avatar>
<v-img :src='track.albumArt.thumb'></v-img>
</v-list-item-avatar>
@ -93,6 +93,15 @@
<v-list-item-title>{{$t("Remove from playlist")}}</v-list-item-title>
</v-list-item-content>
</v-list-item>
<!-- Share -->
<v-list-item dense @click='share'>
<v-list-item-icon>
<v-icon>mdi-share-variant</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{$t("Share")}}</v-list-item-title>
</v-list-item-content>
</v-list-item>
<!-- Play track mix -->
<v-list-item dense @click='trackMix'>
<v-list-item-icon>
@ -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!');
}
}
}

View File

@ -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": "بلد المحتوى"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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;

View File

@ -50,7 +50,7 @@
<v-list-item-subtitle>Developer</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
<v-list-item @click='openUrl("https://git.fuwafuwa.moe/RemixDev/deemix")'>
<v-list-item>
<v-list-item-content>
<v-list-item-title class='font-weight-bold'>Deemix</v-list-item-title>
<v-list-item-subtitle>Much better app &lt;3</v-list-item-subtitle>

View File

@ -11,7 +11,7 @@
<!-- Split to half -->
<v-row class='pa-2' no-gutters justify="center">
<!-- Left side (track info...) -->
<v-col class='col-6 text-center' align-self="center">
<v-col class='col-12 col-sm-6 text-center' align-self="center">
<v-img
:src='$root.track.albumArt.full'
:lazy-src="$root.track.albumArt.thumb"
@ -94,6 +94,10 @@
<v-icon>mdi-download</v-icon>
</v-btn>
<v-btn icon @click='share'>
<v-icon>mdi-share-variant</v-icon>
</v-btn>
<!-- Volume -->
<v-slider
min='0.00'
@ -118,7 +122,7 @@
</v-col>
<!-- Right side -->
<v-col class='col-6 pt-4'>
<v-col class='col-12 col-sm-6 pt-4'>
<v-tabs v-model='tab'>
<v-tab key='queue'>
{{$t("Queue")}}
@ -135,18 +139,18 @@
<!-- Queue tab -->
<v-tab-item key='queue'>
<v-list two-line avatar class='overflow-y-auto' style='max-height: calc(100vh - 160px)'>
<v-lazy
min-height="1"
transition="fade-transition"
v-for="(track, index) in $root.queue.data"
:key='index + "q" + track.id'
><TrackTile
:track='track'
@click='$root.playIndex(index)'
@redirect='close'
></TrackTile>
</v-lazy>
<draggable v-model='$root.queue.data' @change='queueMove'>
<div v-for="(track, index) in $root.queue.data" :key='index + "q" + track.id'>
<v-lazy min-height="1" transition="fade-transition">
<TrackTile
:track='track'
@click='$root.playIndex(index)'
@redirect='close'
:ripple='false'
></TrackTile>
</v-lazy>
</div>
</draggable>
</v-list>
</v-tab-item>
<!-- Info tab -->
@ -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() {

View File

@ -22,7 +22,7 @@
<span class='text-subtitle-2'>{{$numberString(playlist.fans)}} {{$t('fans')}}</span><br>
</div>
<div class='my-2'>
<div class='my-2 d-flex'>
<v-btn color='primary' class='mr-1' @click='play'>
<v-icon left>mdi-play</v-icon>
{{$t('Play')}}
@ -45,6 +45,16 @@
<v-icon left>mdi-delete</v-icon>
{{$t('Delete')}}
</v-btn>
<div class='mx-2' dense stlye='max-width: 120px;'>
<v-select class='px-2' dense solo :items='sortTypes' @change='sort' :label='$t("Sort by")'>
</v-select>
</div>
<div class='px-2' @click='reverseSort'>
<v-btn icon>
<v-icon v-if='isReversed'>mdi-sort-reverse-variant</v-icon>
<v-icon v-if='!isReversed'>mdi-sort-variant</v-icon>
</v-btn>
</div>
</div>
</div>
</v-card>
@ -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();

View File

@ -211,6 +211,23 @@
<v-subheader>{{$t("Other")}}</v-subheader>
<v-divider></v-divider>
<div class='d-flex mx-4 pt-2'>
<v-select
v-model='$root.settings.contentLanguage'
:items='languageList'
:label='$t("Content language")'
class='mr-4'
></v-select>
<v-select
v-model='$root.settings.contentCountry'
:items='countryList'
:label='$t("Content country")'
class='ml-4'
></v-select>
</div>
<!-- Minimize to tray -->
<v-list-item v-if='$root.settings.electron'>
<v-list-item-action>
@ -283,6 +300,7 @@
</template>
<script>
export default {
name: 'Settings',
data() {
@ -320,7 +338,11 @@ export default {
primaryColorIndex: 0,
primaries: ['#F44336', '#E91E63', '#9C27B0', '#673AB7', '#3F51B5', '#2196F3', '#03A9F4',
'#00BCD4', '#009688', '#4CAF50', '#8BC34A', '#CDDC39', '#FFEB3B', '#FFC107', '#FF9800', '#FF5722',
'#795548', '#607D8B', '#9E9E9E']
'#795548', '#607D8B', '#9E9E9E'],
//Lists from Deezer website
languageList: ["me", "da", "de", "en", "us", "es", "mx", "fr", "hr", "id", "it", "hu", "ms", "nl", "no", "pl", "br", "pt", "ru", "ro", "sq", "sk", "sl", "sr", "fi", "sv", "tr", "cs", "bg", "uk", "he", "ar", "th", "cn", "ja", "ko"],
countryList: ["AF", "AL", "DZ", "AO", "AI", "AG", "AR", "AM", "AU", "AT", "AZ", "BH", "BD", "BB", "BY", "BE", "BJ", "BT", "BO", "BA", "BW", "BR", "IO", "VG", "BN", "BG", "BF", "BI", "KH", "CM", "CA", "CV", "KY", "CF", "TD", "CL", "CX", "CC", "CO", "CK", "CR", "HR", "CY", "CZ", "CD", "DK", "DJ", "DM", "TL", "EC", "EG", "SV", "GQ", "ER", "EE", "ET", "FM", "FJ", "FI", "FR", "GA", "GM", "GE", "DE", "GH", "GR", "GD", "GT", "GN", "GW", "HN", "HU", "IS", "ID", "IQ", "IE", "IL", "IT", "JM", "JP", "JO", "KZ", "KE", "KI", "KW", "KG", "LA", "LV", "LB", "LS", "LR", "LY", "LT", "LU", "MK", "MG", "MW", "MY", "ML", "MT", "MH", "MR", "MU", "MX", "MD", "MN", "ME", "MS", "MA", "MZ", "NA", "NR", "NP", "NZ", "NI", "NE", "NG", "NU", "NF", "NO", "OM", "PK", "PW", "PA", "PG", "PY", "PE", "PL", "PT", "QA", "CG", "RO", "RU", "RW", "KN", "LC", "VC", "WS", "ST", "SA", "SN", "RS", "SC", "SL", "SG", "SK", "SI", "SO", "ZA", "ES", "LK", "SJ", "SZ", "SE", "CH", "TJ", "TZ", "TH", "KM", "FK", "CI", "MV", "NL", "PH", "PN", "SB", "TG", "TK", "TO", "TN", "TR", "TM", "TC", "TV", "UG", "UA", "AE", "GB", "US", "UY", "UZ", "VU", "VE", "VN", "YE", "ZM", "ZW"],
}
},
methods: {

48
app/package-lock.json generated
View File

@ -1,6 +1,6 @@
{
"name": "freezer",
"version": "1.0.10",
"version": "1.1.7",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@ -88,12 +88,6 @@
}
}
},
"@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
},
"accepts": {
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
@ -152,14 +146,10 @@
"color-convert": "^1.9.0"
}
},
"argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
"requires": {
"sprintf-js": "~1.0.2"
}
"arg": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="
},
"array-flatten": {
"version": "1.1.1",
@ -348,19 +338,16 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"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==",
"dev": true,
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"requires": {
"@types/color-name": "^1.1.1",
"color-convert": "^2.0.1"
}
},
@ -368,7 +355,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
"color-name": "~1.1.4"
}
@ -376,20 +362,17 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
},
"supports-color": {
"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"
}
@ -1279,6 +1262,17 @@
"requires": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
},
"dependencies": {
"argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
"requires": {
"sprintf-js": "~1.0.2"
}
}
}
},
"jsbn": {

View File

@ -1,7 +1,7 @@
{
"name": "freezer",
"private": true,
"version": "1.1.6",
"version": "1.1.7",
"description": "",
"main": "background.js",
"scripts": {
@ -10,8 +10,10 @@
"author": "",
"license": "ISC",
"dependencies": {
"arg": "^4.1.3",
"axios": "^0.19.2",
"browser-id3-writer": "^4.4.0",
"chalk": "^4.1.0",
"discord-rpc": "^3.1.4",
"express": "^4.17.1",
"lastfmapi": "^0.1.1",

View File

@ -91,13 +91,13 @@ app.get('/track/:id', async (req, res) => {
//Get album by id
app.get('/album/:id', async (req, res) => {
let data = await deezer.callApi('deezer.pageAlbum', {alb_id: req.params.id.toString(), lang: 'us'});
let data = await deezer.callApi('deezer.pageAlbum', {alb_id: req.params.id.toString(), lang: settings.contentLanguage});
res.send(new Album(data.results.DATA, data.results.SONGS));
});
//Get artist by id
app.get('/artist/:id', async (req, res) => {
let data = await deezer.callApi('deezer.pageArtist', {art_id: req.params.id.toString(), lang: 'us'});
let data = await deezer.callApi('deezer.pageArtist', {art_id: req.params.id.toString(), lang: settings.contentLanguage});
res.send(new Artist(data.results.DATA, data.results.ALBUMS, data.results.TOP));
});
@ -108,7 +108,7 @@ app.get('/playlist/:id', async (req, res) => {
let nb = req.query.full ? 100000 : 50;
let data = await deezer.callApi('deezer.pagePlaylist', {
playlist_id: req.params.id.toString(),
lang: 'us',
lang: settings.contentLanguage,
nb: nb,
start: req.query.start ? parseInt(req.query.start, 10) : 0,
tags: true
@ -319,7 +319,7 @@ app.get('/page', async (req, res) => {
'large-card': ['album', 'playlist', 'show', 'video-link'],
'ads': [] //None
},
'LANG': 'us',
'LANG': settings.contentLanguage,
'OPTIONS': []
});
res.send(new DeezerPage(data.results));
@ -496,7 +496,7 @@ io.on('connection', (socket) => {
});
//ecb = Error callback
async function createServer(electron = false, ecb) {
async function createServer(electron = false, ecb, override = {}) {
//Prepare globals
settings = new Settings(electron);
settings.load();
@ -542,12 +542,18 @@ async function createServer(electron = false, ecb) {
});
});
//Start server
//Error callback
server.on('error', (e) => {
ecb(e);
if (ecb)
ecb(e);
logger.error(e);
});
server.listen(settings.port, settings.serverIp);
console.log(`Running on: http://${settings.serverIp}:${settings.port}`);
//Start server
let serverIp = override.host ? override.host : settings.serverIp;
let port = override.port ? override.port: settings.port;
server.listen(port, serverIp);
console.log(`Running on: http://${serverIp}:${port}`);
return settings;
}

View File

@ -40,6 +40,8 @@ class Settings {
this.playlistFolder = false;
this.forceWhiteTrayIcon = false;
this.contentLanguage = 'en';
this.contentCountry = 'US';
}
//Based on electorn app.getPath

BIN
freezerpc.tar Normal file

Binary file not shown.

View File

@ -1,7 +1,7 @@
{
"name": "freezer",
"private": true,
"version": "1.1.6",
"version": "1.1.7",
"description": "",
"scripts": {
"pack": "electron-builder --dir",
@ -30,7 +30,8 @@
],
"win": {
"target": [
"portable", "nsis"
"portable",
"nsis"
],
"icon": "build/icon.ico",
"asarUnpack": [