museria 0.2.49 → 0.3.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/.eslintrc +10 -2
- package/.github/workflows/build.yml +3 -3
- package/.github/workflows/publish.yml +3 -3
- package/README.md +55 -59
- package/bin/actions.js +28 -28
- package/bin/index.js +4 -4
- package/bin/runner.js +1 -1
- package/bin/utils.js +6 -2
- package/dist/client/museria.client.js +7 -7
- package/dist/face/45a265d0f07b31cde85f.ttf +0 -0
- package/dist/face/6205fd00fb1b573e9f0f.ttf +0 -0
- package/dist/face/8d3cabfc66809162fb4d.woff2 +0 -0
- package/dist/face/fb8184add5a3101ad0a3.woff2 +0 -0
- package/dist/face/museria.face.js +33 -13
- package/dist/face/style.css +13 -11
- package/package.json +41 -40
- package/src/browser/client/index.js +2 -1
- package/src/browser/face/client.js +2 -1
- package/src/browser/face/controllers/app/app.html +77 -69
- package/src/browser/face/controllers/app/app.js +14 -7
- package/src/browser/face/controllers/app/app.scss +2 -22
- package/src/browser/face/index.js +3 -3
- package/src/browser/face/styles/main.scss +91 -11
- package/src/browser/face/styles/vars.scss +0 -1
- package/src/client.js +73 -74
- package/src/collection/transports/music/index.js +20 -18
- package/src/db/transports/database/index.js +7 -5
- package/src/db/transports/loki/index.js +30 -25
- package/src/errors.js +2 -1
- package/src/index.js +8 -6
- package/src/node.js +312 -323
- package/src/schema.js +27 -29
- package/src/server/transports/express/api/butler/controllers.js +7 -10
- package/src/server/transports/express/api/butler/routes.js +5 -5
- package/src/server/transports/express/api/master/controllers.js +7 -10
- package/src/server/transports/express/api/master/routes.js +5 -5
- package/src/server/transports/express/api/node/controllers.js +52 -61
- package/src/server/transports/express/api/node/routes.js +10 -10
- package/src/server/transports/express/api/routes.js +1 -1
- package/src/server/transports/express/api/slave/controllers.js +7 -10
- package/src/server/transports/express/api/slave/routes.js +6 -6
- package/src/server/transports/express/client/controllers.js +40 -61
- package/src/server/transports/express/client/routes.js +33 -39
- package/src/server/transports/express/controllers.js +10 -21
- package/src/server/transports/express/index.js +23 -20
- package/src/server/transports/express/midds.js +67 -67
- package/src/server/transports/express/routes.js +12 -12
- package/src/utils.js +175 -184
- package/test/client.js +311 -305
- package/test/db/database.js +32 -28
- package/test/db/loki.js +78 -74
- package/test/group.js +161 -156
- package/test/index.js +20 -10
- package/test/node.js +461 -460
- package/test/routes.js +404 -399
- package/test/server/express.js +35 -31
- package/test/services.js +25 -18
- package/test/tools.js +8 -6
- package/test/utils.js +236 -234
- package/webpack.client.js +9 -7
- package/webpack.face.js +8 -6
- package/dist/face/fa-brands-400.eot +0 -0
- package/dist/face/fa-brands-400.svg +0 -3717
- package/dist/face/fa-brands-400.ttf +0 -0
- package/dist/face/fa-brands-400.woff +0 -0
- package/dist/face/fa-brands-400.woff2 +0 -0
- package/dist/face/fa-solid-900.eot +0 -0
- package/dist/face/fa-solid-900.svg +0 -5034
- package/dist/face/fa-solid-900.ttf +0 -0
- package/dist/face/fa-solid-900.woff +0 -0
- package/dist/face/fa-solid-900.woff2 +0 -0
- /package/dist/face/{open-sans.ttf → 17e98b9e5586529b13cc.ttf} +0 -0
- /package/dist/face/{proxima-nova.ttf → 326601dfabd91e3f016c.ttf} +0 -0
- /package/dist/face/{logo.svg → ee9c6af64aa224827cec.svg} +0 -0
@@ -1,32 +1,26 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
import errors from "../../../../errors.js";
|
2
|
+
import utils from "../../../../utils.js";
|
3
3
|
|
4
|
-
|
5
|
-
* Request the song
|
6
|
-
*/
|
7
|
-
module.exports.requestSong = node => {
|
4
|
+
export const requestSong = node => {
|
8
5
|
return async (req, res, next) => {
|
9
6
|
try {
|
10
7
|
const title = req.query.title;
|
11
|
-
node.songTitleTest(title);
|
8
|
+
node.songTitleTest(title);
|
12
9
|
const link = await node.getSongLink(title, req.query.type);
|
13
10
|
|
14
|
-
if(!link) {
|
11
|
+
if (!link) {
|
15
12
|
throw new errors.NotFoundError('File not found');
|
16
13
|
}
|
17
14
|
|
18
15
|
res.redirect(link);
|
19
16
|
}
|
20
|
-
catch(err) {
|
17
|
+
catch (err) {
|
21
18
|
next(err);
|
22
19
|
}
|
23
|
-
}
|
20
|
+
};
|
24
21
|
};
|
25
22
|
|
26
|
-
|
27
|
-
* Get the song info
|
28
|
-
*/
|
29
|
-
module.exports.getSongInfo = node => {
|
23
|
+
export const getSongInfo = node => {
|
30
24
|
return async (req, res, next) => {
|
31
25
|
try {
|
32
26
|
const title = req.body.title;
|
@@ -34,51 +28,42 @@ module.exports.getSongInfo = node => {
|
|
34
28
|
const info = await node.getSongInfo(title, node.prepareClientMessageOptions(req.body));
|
35
29
|
res.send({ info });
|
36
30
|
}
|
37
|
-
catch(err) {
|
31
|
+
catch (err) {
|
38
32
|
next(err);
|
39
33
|
}
|
40
|
-
}
|
34
|
+
};
|
41
35
|
};
|
42
36
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
next(err);
|
58
|
-
}
|
59
|
-
}
|
37
|
+
export const findSongs = node => {
|
38
|
+
return async (req, res, next) => {
|
39
|
+
try {
|
40
|
+
const str = req.body.str;
|
41
|
+
const limit = req.body.limit;
|
42
|
+
const songs = await node.findSongs(str, node.prepareClientMessageOptions(req.body, {
|
43
|
+
limit
|
44
|
+
}));
|
45
|
+
res.send({ songs });
|
46
|
+
}
|
47
|
+
catch (err) {
|
48
|
+
next(err);
|
49
|
+
}
|
50
|
+
};
|
60
51
|
};
|
61
52
|
|
62
|
-
|
63
|
-
* Find artist songs
|
64
|
-
*/
|
65
|
-
module.exports.findArtistSongs = node => {
|
53
|
+
export const findArtistSongs = node => {
|
66
54
|
return async (req, res, next) => {
|
67
55
|
try {
|
68
56
|
const artist = req.body.artist;
|
69
57
|
const songs = await node.findArtistSongs(artist, node.prepareClientMessageOptions(req.body));
|
70
58
|
res.send({ songs });
|
71
59
|
}
|
72
|
-
catch(err) {
|
60
|
+
catch (err) {
|
73
61
|
next(err);
|
74
62
|
}
|
75
|
-
}
|
76
|
-
|
63
|
+
};
|
64
|
+
};
|
77
65
|
|
78
|
-
|
79
|
-
* Get the song link
|
80
|
-
*/
|
81
|
-
module.exports.getSongLink = node => {
|
66
|
+
export const getSongLink = node => {
|
82
67
|
return async (req, res, next) => {
|
83
68
|
try {
|
84
69
|
const title = req.body.title;
|
@@ -86,40 +71,34 @@ module.exports.getSongLink = node => {
|
|
86
71
|
const link = await node.getSongLink(title, req.body.type, node.prepareClientMessageOptions(req.body));
|
87
72
|
res.send({ link });
|
88
73
|
}
|
89
|
-
catch(err) {
|
74
|
+
catch (err) {
|
90
75
|
next(err);
|
91
76
|
}
|
92
|
-
}
|
77
|
+
};
|
93
78
|
};
|
94
79
|
|
95
|
-
|
96
|
-
* Add the song
|
97
|
-
*/
|
98
|
-
module.exports.addSong = node => {
|
80
|
+
export const addSong = node => {
|
99
81
|
return async (req, res, next) => {
|
100
82
|
try {
|
101
83
|
const file = req.body.file;
|
102
|
-
|
103
|
-
if(!utils.isFileReadStream(file)) {
|
84
|
+
|
85
|
+
if (!utils.isFileReadStream(file)) {
|
104
86
|
throw new errors.WorkError('"file" field is invalid', 'ERR_MUSERIA_INVALID_FILE_FIELD');
|
105
87
|
}
|
106
88
|
|
107
|
-
const result = await node.addSong(file, node.prepareClientMessageOptions(req.body, {
|
89
|
+
const result = await node.addSong(file, node.prepareClientMessageOptions(req.body, {
|
108
90
|
controlled: !!req.body.controlled,
|
109
91
|
priority: parseInt(req.body.priority || 0)
|
110
92
|
}));
|
111
93
|
res.send(result);
|
112
94
|
}
|
113
|
-
catch(err) {
|
95
|
+
catch (err) {
|
114
96
|
next(err);
|
115
97
|
}
|
116
|
-
}
|
98
|
+
};
|
117
99
|
};
|
118
100
|
|
119
|
-
|
120
|
-
* Remove the song
|
121
|
-
*/
|
122
|
-
module.exports.removeSong = node => {
|
101
|
+
export const removeSong = node => {
|
123
102
|
return async (req, res, next) => {
|
124
103
|
try {
|
125
104
|
const title = req.body.title;
|
@@ -127,8 +106,8 @@ module.exports.removeSong = node => {
|
|
127
106
|
const result = await node.removeSong(title, node.prepareClientMessageOptions(req.body));
|
128
107
|
res.send(result);
|
129
108
|
}
|
130
|
-
catch(err) {
|
109
|
+
catch (err) {
|
131
110
|
next(err);
|
132
111
|
}
|
133
|
-
}
|
112
|
+
};
|
134
113
|
};
|
@@ -1,15 +1,15 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
import * as controllers from "./controllers.js";
|
2
|
+
import midds from "../midds.js";
|
3
3
|
|
4
|
-
|
4
|
+
export default [
|
5
5
|
/**
|
6
6
|
* Request the song
|
7
|
-
*
|
7
|
+
*
|
8
8
|
* @api {get} /client/request-song/
|
9
9
|
* @apiParam {string} title
|
10
10
|
* @apiParam {string} type
|
11
11
|
*/
|
12
|
-
{
|
12
|
+
{
|
13
13
|
name: 'requestSong',
|
14
14
|
method: 'get',
|
15
15
|
url: '/request-song',
|
@@ -18,108 +18,102 @@ module.exports = [
|
|
18
18
|
controllers.requestSong
|
19
19
|
]
|
20
20
|
},
|
21
|
-
|
22
21
|
/**
|
23
22
|
* Get the song info
|
24
|
-
*
|
23
|
+
*
|
25
24
|
* @api {post} /client/get-song-info
|
26
25
|
* @apiParam {string} title - song title
|
27
26
|
* @apiSuccess {object} - { info: [{...}] }
|
28
27
|
*/
|
29
|
-
{
|
30
|
-
name: 'getSongInfo',
|
31
|
-
method: 'post',
|
28
|
+
{
|
29
|
+
name: 'getSongInfo',
|
30
|
+
method: 'post',
|
32
31
|
url: '/get-song-info',
|
33
32
|
fn: [
|
34
33
|
midds.requestQueueClient,
|
35
34
|
controllers.getSongInfo
|
36
35
|
]
|
37
36
|
},
|
38
|
-
|
39
37
|
/**
|
40
38
|
* Find songs
|
41
|
-
*
|
39
|
+
*
|
42
40
|
* @api {post} /client/find-songs
|
43
41
|
* @apiParam {string} str
|
44
42
|
* @apiSuccess {object} - { songs: [{...}] }
|
45
43
|
*/
|
46
|
-
|
47
|
-
name: 'findSongs',
|
48
|
-
method: 'post',
|
44
|
+
{
|
45
|
+
name: 'findSongs',
|
46
|
+
method: 'post',
|
49
47
|
url: '/find-songs',
|
50
48
|
fn: [
|
51
49
|
midds.requestQueueClient,
|
52
50
|
controllers.findSongs
|
53
51
|
]
|
54
52
|
},
|
55
|
-
|
56
53
|
/**
|
57
54
|
* Find artist songs
|
58
|
-
*
|
55
|
+
*
|
59
56
|
* @api {post} /client/find-artist-songs
|
60
57
|
* @apiParam {string} artist
|
61
58
|
* @apiSuccess {object} - { songs: [{...}] }
|
62
59
|
*/
|
63
|
-
|
64
|
-
name: 'findArtistSongs',
|
65
|
-
method: 'post',
|
60
|
+
{
|
61
|
+
name: 'findArtistSongs',
|
62
|
+
method: 'post',
|
66
63
|
url: '/find-artist-songs',
|
67
64
|
fn: [
|
68
65
|
midds.requestQueueClient,
|
69
66
|
controllers.findArtistSongs
|
70
67
|
]
|
71
68
|
},
|
72
|
-
|
73
69
|
/**
|
74
70
|
* Get the song link
|
75
|
-
*
|
71
|
+
*
|
76
72
|
* @api {post} /client/get-song-link
|
77
73
|
* @apiParam {string} title - song title
|
78
74
|
* @apiParam {string} type - file type
|
79
75
|
* @apiSuccess {object} - { link: '' }
|
80
76
|
*/
|
81
|
-
{
|
82
|
-
name: 'getSongLink',
|
83
|
-
method: 'post',
|
77
|
+
{
|
78
|
+
name: 'getSongLink',
|
79
|
+
method: 'post',
|
84
80
|
url: '/get-song-link',
|
85
81
|
fn: [
|
86
82
|
midds.requestQueueClient,
|
87
83
|
controllers.getSongLink
|
88
84
|
]
|
89
85
|
},
|
90
|
-
|
91
86
|
/**
|
92
87
|
* Add the song
|
93
|
-
*
|
88
|
+
*
|
94
89
|
* @api {post} /client/add-song/
|
95
|
-
* @apiParam {fs.ReadStream|string} file
|
90
|
+
* @apiParam {fs.ReadStream|string} file
|
96
91
|
* @apiSuccess {object} - { title: '', audioLink: '', coverLink: '', tags: {...} }
|
97
92
|
*/
|
98
|
-
{
|
99
|
-
name: 'addSong',
|
93
|
+
{
|
94
|
+
name: 'addSong',
|
100
95
|
method: 'post',
|
101
|
-
url: '/add-song',
|
96
|
+
url: '/add-song',
|
102
97
|
fn: (node) => [
|
103
98
|
midds.requestQueueClient(node, { limit: node.options.request.clientStoringConcurrency }),
|
104
|
-
midds.filesFormData(node),
|
105
|
-
controllers.addSong(node)
|
99
|
+
midds.filesFormData(node),
|
100
|
+
controllers.addSong(node)
|
106
101
|
]
|
107
102
|
},
|
108
|
-
|
109
103
|
/**
|
110
104
|
* Remove the song
|
111
|
-
*
|
105
|
+
*
|
112
106
|
* @api {post} /client/remove-song
|
113
107
|
* @apiParam {string} title - song title
|
114
108
|
* @apiSuccess {object} - { removed: 0 }
|
115
109
|
*/
|
116
|
-
{
|
110
|
+
{
|
117
111
|
name: 'removeSong',
|
118
|
-
method: 'post',
|
112
|
+
method: 'post',
|
119
113
|
url: '/remove-song',
|
120
114
|
fn: [
|
121
115
|
midds.requestQueueClient,
|
122
116
|
controllers.removeSong
|
123
117
|
]
|
124
|
-
}
|
125
|
-
];
|
118
|
+
}
|
119
|
+
];
|
@@ -1,24 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
import * as express from "express";
|
2
|
+
import faviconLib from "serve-favicon";
|
3
|
+
import path from "path";
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
module.exports.indexPage = () => {
|
9
|
-
return (req, res) => res.sendFile(path.resolve(__dirname, '../../../browser/face/index.html'));
|
10
|
-
};
|
5
|
+
const __dirname = new URL('.', import.meta.url).pathname;
|
6
|
+
const favicon = () => faviconLib(path.resolve(__dirname, '../../../browser/face/favicon.png'));
|
7
|
+
const stat = () => express.static(path.resolve(__dirname, '../../../../dist/face'));
|
11
8
|
|
12
|
-
|
13
|
-
|
14
|
-
*/
|
15
|
-
module.exports.favicon = () => {
|
16
|
-
return favicon(path.resolve(__dirname, '../../../browser/face/favicon.png'));
|
9
|
+
export const indexPage = () => {
|
10
|
+
return (req, res) => res.sendFile(path.resolve(__dirname, '../../../browser/face/index.html'));
|
17
11
|
};
|
18
|
-
|
19
|
-
|
20
|
-
* Server static handler
|
21
|
-
*/
|
22
|
-
module.exports.static = () => {
|
23
|
-
return express.static(path.resolve(__dirname, '../../../../dist/face'));
|
24
|
-
};
|
12
|
+
export { favicon };
|
13
|
+
export { stat as static };
|
@@ -1,16 +1,19 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
1
|
+
import expressStoracle from "storacle/src/server/transports/express/index.js";
|
2
|
+
import expressMetastocle from "metastocle/src/server/transports/express/index.js";
|
3
|
+
import routes from "./routes.js";
|
4
|
+
import routesClient from "./client/routes.js";
|
5
|
+
import routesApi from "./api/routes.js";
|
6
|
+
import routesApiMaster from "./api/master/routes.js";
|
7
|
+
import routesApiButler from "./api/butler/routes.js";
|
8
|
+
import routesApiSlave from "./api/slave/routes.js";
|
9
|
+
import routesApiNode from "./api/node/routes.js";
|
10
10
|
|
11
|
-
|
11
|
+
const ServerExpressStoracle = expressStoracle();
|
12
|
+
const ServerExpressMetastocle = expressMetastocle(ServerExpressStoracle);
|
13
|
+
|
14
|
+
export default (Parent) => {
|
12
15
|
return class ServerExpressMuseria extends (Parent || ServerExpressMetastocle) {
|
13
|
-
|
16
|
+
/**
|
14
17
|
* @see ServerExpressMetastocle.prototype.getMainRoutes
|
15
18
|
*/
|
16
19
|
getMainRoutes() {
|
@@ -22,26 +25,26 @@ module.exports = (Parent) => {
|
|
22
25
|
arr.splice(arr.findIndex(r => r.name == 'notFound'), 0, ...end);
|
23
26
|
return arr;
|
24
27
|
}
|
25
|
-
|
28
|
+
|
26
29
|
/**
|
27
30
|
* @see ServerExpressMetastocle.prototype.getClientRoutes
|
28
31
|
*/
|
29
32
|
getClientRoutes() {
|
30
33
|
const remove = [
|
31
|
-
'addDocument', 'updateDocuments',
|
34
|
+
'addDocument', 'updateDocuments',
|
32
35
|
'deleteDocuments', 'getDocumentsCount',
|
33
36
|
'getDocumentByPk', 'getDocuments', 'removeFile'
|
34
37
|
];
|
35
38
|
return super.getClientRoutes().filter(r => !remove.includes(r.name)).concat(routesClient);
|
36
39
|
}
|
37
|
-
|
40
|
+
|
38
41
|
/**
|
39
42
|
* @see ServerExpressMetastocle.prototype.getApiRoutes
|
40
43
|
*/
|
41
|
-
getApiRoutes() {
|
44
|
+
getApiRoutes() {
|
42
45
|
return super.getApiRoutes().concat(routesApi);
|
43
46
|
}
|
44
|
-
|
47
|
+
|
45
48
|
/**
|
46
49
|
* @see ServerExpressMetastocle.prototype.getApiMasterRoutes
|
47
50
|
*/
|
@@ -57,7 +60,7 @@ module.exports = (Parent) => {
|
|
57
60
|
const remove = ['updateDocuments', 'deleteDocuments', 'removeFile'];
|
58
61
|
return super.getApiButlerRoutes().filter(r => !remove.includes(r.name)).concat(routesApiButler);
|
59
62
|
}
|
60
|
-
|
63
|
+
|
61
64
|
/**
|
62
65
|
* @see ServerExpressMetastocle.prototype.getApiSlaveRoutes
|
63
66
|
*/
|
@@ -65,7 +68,7 @@ module.exports = (Parent) => {
|
|
65
68
|
const remove = ['updateDocuments', 'deleteDocuments', 'removeFile'];
|
66
69
|
return super.getApiSlaveRoutes().filter(r => !remove.includes(r.name)).concat(routesApiSlave);
|
67
70
|
}
|
68
|
-
|
71
|
+
|
69
72
|
/**
|
70
73
|
* @see ServerExpressMetastocle.prototype.getApiNodeRoutes
|
71
74
|
*/
|
@@ -73,5 +76,5 @@ module.exports = (Parent) => {
|
|
73
76
|
const remove = ['addDocument', 'storFile'];
|
74
77
|
return super.getApiNodeRoutes().filter(r => !remove.includes(r.name)).concat(routesApiNode);
|
75
78
|
}
|
76
|
-
}
|
77
|
-
};
|
79
|
+
};
|
80
|
+
};
|