gerdur 0.0.0-probe → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/LICENSE +0 -0
- package/README.md +231 -1
- package/dist/package.json +89 -0
- package/dist/src/gerdur.d.ts +2 -0
- package/dist/src/gerdur.js +345 -0
- package/dist/src/index.d.ts +62 -0
- package/dist/src/index.js +101 -0
- package/dist/src/lib/api-download.d.ts +54 -0
- package/dist/src/lib/api-download.js +89 -0
- package/dist/src/lib/arl-setup.d.ts +82 -0
- package/dist/src/lib/arl-setup.js +274 -0
- package/dist/src/lib/auto-updater.d.ts +2 -0
- package/dist/src/lib/auto-updater.js +70 -0
- package/dist/src/lib/config.d.ts +53 -0
- package/dist/src/lib/config.js +164 -0
- package/dist/src/lib/decrypt.d.ts +4 -0
- package/dist/src/lib/decrypt.js +17 -0
- package/dist/src/lib/download-track.d.ts +24 -0
- package/dist/src/lib/download-track.js +163 -0
- package/dist/src/lib/email-login.d.ts +16 -0
- package/dist/src/lib/email-login.js +111 -0
- package/dist/src/lib/session.d.ts +84 -0
- package/dist/src/lib/session.js +118 -0
- package/dist/src/lib/signale.d.ts +15 -0
- package/dist/src/lib/signale.js +20 -0
- package/dist/src/lib/update-check.d.ts +2 -0
- package/dist/src/lib/update-check.js +30 -0
- package/dist/src/lib/util.d.ts +17 -0
- package/dist/src/lib/util.js +94 -0
- package/package.json +87 -5
- package/setup-termux.js +41 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.commonPath = exports.progressBar = exports.saveLayout = exports.formatSecondsReadable = exports.sanitizeFilename = void 0;
|
|
7
|
+
const dot_prop_1 = __importDefault(require("dot-prop"));
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const sanitizeFilename = (input, replacement = '_') => {
|
|
11
|
+
/* eslint-disable-next-line */
|
|
12
|
+
const UNSAFE_CHARS = /[\/\?<>\\:\*\|"]/g;
|
|
13
|
+
if (typeof input !== 'string') {
|
|
14
|
+
return '';
|
|
15
|
+
}
|
|
16
|
+
if (process.platform === 'win32' && input.endsWith('.')) {
|
|
17
|
+
return (input.slice(0, -1) + replacement).replace(UNSAFE_CHARS, replacement).trim();
|
|
18
|
+
}
|
|
19
|
+
return input.replace(UNSAFE_CHARS, replacement).trim();
|
|
20
|
+
};
|
|
21
|
+
exports.sanitizeFilename = sanitizeFilename;
|
|
22
|
+
const formatSecondsReadable = (time) => {
|
|
23
|
+
if (time < 60) {
|
|
24
|
+
return time + 's';
|
|
25
|
+
}
|
|
26
|
+
const minutes = time >= 60 ? Math.floor(time / 60) : 0;
|
|
27
|
+
const seconds = Math.floor(time - minutes * 60);
|
|
28
|
+
return `${minutes >= 10 ? minutes : '0' + minutes}m ${seconds >= 10 ? seconds : '0' + seconds}s`;
|
|
29
|
+
};
|
|
30
|
+
exports.formatSecondsReadable = formatSecondsReadable;
|
|
31
|
+
const saveLayout = ({ track, album, path: filePath, minimumIntegerDigits, trackNumber }) => {
|
|
32
|
+
// Clone album info
|
|
33
|
+
const albumInfo = { ...album };
|
|
34
|
+
// Use relative path
|
|
35
|
+
if (filePath.startsWith('{')) {
|
|
36
|
+
filePath = './' + filePath;
|
|
37
|
+
}
|
|
38
|
+
// Transform values
|
|
39
|
+
/* eslint-disable-next-line */
|
|
40
|
+
const file = filePath.match(/(?<=\{)[^\}]*/g);
|
|
41
|
+
if (file) {
|
|
42
|
+
if (track.DISK_NUMBER &&
|
|
43
|
+
album.NUMBER_DISK &&
|
|
44
|
+
album.ALB_TITLE &&
|
|
45
|
+
Number(album.NUMBER_DISK) > 1 &&
|
|
46
|
+
!album.ALB_TITLE.includes('Disc')) {
|
|
47
|
+
albumInfo.ALB_TITLE += ` (Disc ${Number(track.DISK_NUMBER).toLocaleString('en-US', { minimumIntegerDigits: 2 })})`;
|
|
48
|
+
}
|
|
49
|
+
for (const key of file) {
|
|
50
|
+
const value_album = dot_prop_1.default.get(albumInfo, key);
|
|
51
|
+
const value_track = value_album || dot_prop_1.default.get(track, key);
|
|
52
|
+
if (key === 'TRACK_NUMBER' || key === 'TRACK_POSITION' || key === 'NO_TRACK_NUMBER') {
|
|
53
|
+
filePath = filePath.replace(`{${key}}`, value_track ? Number(value_track).toLocaleString('en-US', { minimumIntegerDigits }) : '');
|
|
54
|
+
trackNumber = false;
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
filePath = filePath.replace(`{${key}}`, value_track ? (0, exports.sanitizeFilename)(value_track) : '');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (trackNumber && (track.TRACK_NUMBER || track.TRACK_POSITION)) {
|
|
62
|
+
const [dir, base] = [path_1.default.posix.dirname(filePath), path_1.default.posix.basename(filePath)];
|
|
63
|
+
const position = track.TRACK_POSITION ? track.TRACK_POSITION : Number(track.TRACK_NUMBER);
|
|
64
|
+
filePath = path_1.default.posix.join(dir, position.toLocaleString('en-US', { minimumIntegerDigits }) + ' - ' + base);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
filePath = path_1.default.posix.join(filePath);
|
|
68
|
+
}
|
|
69
|
+
return filePath.replace(/[?%*|"<>]/g, '').trim();
|
|
70
|
+
};
|
|
71
|
+
exports.saveLayout = saveLayout;
|
|
72
|
+
const progressBar = (total, width) => {
|
|
73
|
+
const incomplete = Array(width).fill('█').join('');
|
|
74
|
+
const complete = Array(width).fill('█').join('');
|
|
75
|
+
const unit = total / width;
|
|
76
|
+
// Force color output for consistent behavior across TTY/non-TTY environments
|
|
77
|
+
const colorChalk = new chalk_1.default.Instance({ level: 1 });
|
|
78
|
+
return (value) => {
|
|
79
|
+
let chars = unit === 0 ? width : Math.floor(value / unit);
|
|
80
|
+
if (value >= total) {
|
|
81
|
+
chars = complete.length;
|
|
82
|
+
}
|
|
83
|
+
return colorChalk.cyanBright(complete.slice(0, chars)) + colorChalk.gray(incomplete.slice(chars));
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
exports.progressBar = progressBar;
|
|
87
|
+
const commonPath = (paths) => {
|
|
88
|
+
const A = paths.concat().sort(), a1 = A[0], a2 = A[A.length - 1], L = a1.length;
|
|
89
|
+
let i = 0;
|
|
90
|
+
while (i < L && a1.charAt(i) === a2.charAt(i))
|
|
91
|
+
i++;
|
|
92
|
+
return a1.substring(0, i);
|
|
93
|
+
};
|
|
94
|
+
exports.commonPath = commonPath;
|
package/package.json
CHANGED
|
@@ -1,7 +1,89 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gerdur",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "The crucial streaming module for dabox systems.",
|
|
5
|
+
"author": "Christian",
|
|
6
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"lint": "eslint .",
|
|
9
|
+
"prepublishOnly": "eslint . && tsc",
|
|
10
|
+
"prebuild": "eslint .",
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"postinstall": "node setup-termux.js",
|
|
13
|
+
"dev": "ts-node src/gerdur.ts",
|
|
14
|
+
"test": "node scripts/run-ava.cjs"
|
|
15
|
+
},
|
|
16
|
+
"bin": {
|
|
17
|
+
"gerdur": "dist/src/gerdur.js"
|
|
18
|
+
},
|
|
19
|
+
"main": "dist/src/index.js",
|
|
20
|
+
"types": "dist/src/index.d.ts",
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"types": "./dist/src/index.d.ts",
|
|
24
|
+
"default": "./dist/src/index.js"
|
|
25
|
+
},
|
|
26
|
+
"./package.json": "./package.json"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist/**/*",
|
|
30
|
+
"setup-termux.js",
|
|
31
|
+
"CHANGELOG.md"
|
|
32
|
+
],
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "git+https://github.com/soulwax/gerdur.git"
|
|
36
|
+
},
|
|
37
|
+
"homepage": "https://github.com/soulwax/gerdur#readme",
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/soulwax/gerdur/issues"
|
|
40
|
+
},
|
|
41
|
+
"publishConfig": {
|
|
42
|
+
"access": "public"
|
|
43
|
+
},
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=12"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"adm-zip": "^0.5.16",
|
|
49
|
+
"chalk": "^4.1.2",
|
|
50
|
+
"commander": "^9.5.0",
|
|
51
|
+
"gerdur-core": "^1.0.3",
|
|
52
|
+
"dot-prop": "^6.0.1",
|
|
53
|
+
"got": "^11.8.6",
|
|
54
|
+
"gradient-string": "^2.0.2",
|
|
55
|
+
"log-update": "^4.0.0",
|
|
56
|
+
"p-queue": "^6.6.2",
|
|
57
|
+
"prompts": "^2.4.2",
|
|
58
|
+
"true-case-path": "^2.2.1",
|
|
59
|
+
"update-check": "^1.5.4"
|
|
60
|
+
},
|
|
61
|
+
"devDependencies": {
|
|
62
|
+
"@types/adm-zip": "^0.4.34",
|
|
63
|
+
"@types/gradient-string": "^1.1.6",
|
|
64
|
+
"@types/node": "^17.0.45",
|
|
65
|
+
"@types/prompts": "^2.4.9",
|
|
66
|
+
"@typescript-eslint/eslint-plugin": "^5.62.0",
|
|
67
|
+
"@typescript-eslint/parser": "^5.62.0",
|
|
68
|
+
"ava": "^4.3.3",
|
|
69
|
+
"eslint": "^8.57.1",
|
|
70
|
+
"eslint-plugin-prettier": "^4.2.5",
|
|
71
|
+
"prettier": "^2.8.8",
|
|
72
|
+
"ts-node": "^10.9.2",
|
|
73
|
+
"typescript": "^4.9.5"
|
|
74
|
+
},
|
|
75
|
+
"ava": {
|
|
76
|
+
"extensions": [
|
|
77
|
+
"ts"
|
|
78
|
+
],
|
|
79
|
+
"files": [
|
|
80
|
+
"!dist"
|
|
81
|
+
],
|
|
82
|
+
"require": [
|
|
83
|
+
"ts-node/register"
|
|
84
|
+
],
|
|
85
|
+
"timeout": "5m",
|
|
86
|
+
"serial": true,
|
|
87
|
+
"verbose": true
|
|
88
|
+
}
|
|
89
|
+
}
|
package/setup-termux.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
const {existsSync, writeFileSync} = require('fs');
|
|
3
|
+
const {spawnSync} = require('child_process');
|
|
4
|
+
|
|
5
|
+
const {HOME, PATH} = process.env;
|
|
6
|
+
const CONFIG_FILE = 'gerdur.config.json';
|
|
7
|
+
|
|
8
|
+
if (HOME && PATH.includes('com.termux') && !existsSync(CONFIG_FILE)) {
|
|
9
|
+
console.log('Setting config file for termux users in ' + CONFIG_FILE);
|
|
10
|
+
const STORAGE_LOCATION = `${HOME}/storage`;
|
|
11
|
+
const DOWNLOAD_LOCATION = `${STORAGE_LOCATION}/downloads`;
|
|
12
|
+
|
|
13
|
+
if (!existsSync(STORAGE_LOCATION)) {
|
|
14
|
+
console.log(
|
|
15
|
+
`It is necessary to grant storage permission for Termux on Android 6 and higher. Use 'Settings>Apps>Termux>Permissions>Storage' and set to true.`,
|
|
16
|
+
);
|
|
17
|
+
spawnSync('termux-setup-storage');
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (existsSync(DOWNLOAD_LOCATION)) {
|
|
21
|
+
writeFileSync(
|
|
22
|
+
CONFIG_FILE,
|
|
23
|
+
JSON.stringify(
|
|
24
|
+
{
|
|
25
|
+
saveLayout: {
|
|
26
|
+
track: `${DOWNLOAD_LOCATION}/Music/{ALB_TITLE}/{SNG_TITLE}`,
|
|
27
|
+
album: `${DOWNLOAD_LOCATION}/Music/{ALB_TITLE}/{SNG_TITLE}`,
|
|
28
|
+
artist: `${DOWNLOAD_LOCATION}/Music/{ALB_TITLE}/{SNG_TITLE}`,
|
|
29
|
+
playlist: `${DOWNLOAD_LOCATION}/Playlist/{TITLE}/{SNG_TITLE}`,
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
null,
|
|
33
|
+
2,
|
|
34
|
+
),
|
|
35
|
+
'utf-8',
|
|
36
|
+
);
|
|
37
|
+
console.log('Done. Config created.');
|
|
38
|
+
} else {
|
|
39
|
+
console.error('Something went wrong. Cannot find downloads location: ' + DOWNLOAD_LOCATION);
|
|
40
|
+
}
|
|
41
|
+
}
|