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.
Files changed (74) hide show
  1. package/.eslintrc +10 -2
  2. package/.github/workflows/build.yml +3 -3
  3. package/.github/workflows/publish.yml +3 -3
  4. package/README.md +55 -59
  5. package/bin/actions.js +28 -28
  6. package/bin/index.js +4 -4
  7. package/bin/runner.js +1 -1
  8. package/bin/utils.js +6 -2
  9. package/dist/client/museria.client.js +7 -7
  10. package/dist/face/45a265d0f07b31cde85f.ttf +0 -0
  11. package/dist/face/6205fd00fb1b573e9f0f.ttf +0 -0
  12. package/dist/face/8d3cabfc66809162fb4d.woff2 +0 -0
  13. package/dist/face/fb8184add5a3101ad0a3.woff2 +0 -0
  14. package/dist/face/museria.face.js +33 -13
  15. package/dist/face/style.css +13 -11
  16. package/package.json +41 -40
  17. package/src/browser/client/index.js +2 -1
  18. package/src/browser/face/client.js +2 -1
  19. package/src/browser/face/controllers/app/app.html +77 -69
  20. package/src/browser/face/controllers/app/app.js +14 -7
  21. package/src/browser/face/controllers/app/app.scss +2 -22
  22. package/src/browser/face/index.js +3 -3
  23. package/src/browser/face/styles/main.scss +91 -11
  24. package/src/browser/face/styles/vars.scss +0 -1
  25. package/src/client.js +73 -74
  26. package/src/collection/transports/music/index.js +20 -18
  27. package/src/db/transports/database/index.js +7 -5
  28. package/src/db/transports/loki/index.js +30 -25
  29. package/src/errors.js +2 -1
  30. package/src/index.js +8 -6
  31. package/src/node.js +312 -323
  32. package/src/schema.js +27 -29
  33. package/src/server/transports/express/api/butler/controllers.js +7 -10
  34. package/src/server/transports/express/api/butler/routes.js +5 -5
  35. package/src/server/transports/express/api/master/controllers.js +7 -10
  36. package/src/server/transports/express/api/master/routes.js +5 -5
  37. package/src/server/transports/express/api/node/controllers.js +52 -61
  38. package/src/server/transports/express/api/node/routes.js +10 -10
  39. package/src/server/transports/express/api/routes.js +1 -1
  40. package/src/server/transports/express/api/slave/controllers.js +7 -10
  41. package/src/server/transports/express/api/slave/routes.js +6 -6
  42. package/src/server/transports/express/client/controllers.js +40 -61
  43. package/src/server/transports/express/client/routes.js +33 -39
  44. package/src/server/transports/express/controllers.js +10 -21
  45. package/src/server/transports/express/index.js +23 -20
  46. package/src/server/transports/express/midds.js +67 -67
  47. package/src/server/transports/express/routes.js +12 -12
  48. package/src/utils.js +175 -184
  49. package/test/client.js +311 -305
  50. package/test/db/database.js +32 -28
  51. package/test/db/loki.js +78 -74
  52. package/test/group.js +161 -156
  53. package/test/index.js +20 -10
  54. package/test/node.js +461 -460
  55. package/test/routes.js +404 -399
  56. package/test/server/express.js +35 -31
  57. package/test/services.js +25 -18
  58. package/test/tools.js +8 -6
  59. package/test/utils.js +236 -234
  60. package/webpack.client.js +9 -7
  61. package/webpack.face.js +8 -6
  62. package/dist/face/fa-brands-400.eot +0 -0
  63. package/dist/face/fa-brands-400.svg +0 -3717
  64. package/dist/face/fa-brands-400.ttf +0 -0
  65. package/dist/face/fa-brands-400.woff +0 -0
  66. package/dist/face/fa-brands-400.woff2 +0 -0
  67. package/dist/face/fa-solid-900.eot +0 -0
  68. package/dist/face/fa-solid-900.svg +0 -5034
  69. package/dist/face/fa-solid-900.ttf +0 -0
  70. package/dist/face/fa-solid-900.woff +0 -0
  71. package/dist/face/fa-solid-900.woff2 +0 -0
  72. /package/dist/face/{open-sans.ttf → 17e98b9e5586529b13cc.ttf} +0 -0
  73. /package/dist/face/{proxima-nova.ttf → 326601dfabd91e3f016c.ttf} +0 -0
  74. /package/dist/face/{logo.svg → ee9c6af64aa224827cec.svg} +0 -0
package/test/utils.js CHANGED
@@ -1,270 +1,272 @@
1
- const assert = require('chai').assert;
2
- const fse = require('fs-extra');
3
- const path = require('path');
4
- const utils = require('../src/utils');
5
- const tools = require('./tools');
6
-
7
- describe('utils', () => {
8
- describe('.splitSongTitle()', () => {
9
- it('should return the right array', () => {
10
- const arr = utils.splitSongTitle('x - a, - b - c')
11
- assert.equal(arr[0], 'x', 'the first part');
12
- assert.equal(arr[1], 'a, - b - c', 'the second part');
13
- });
14
- });
15
-
16
- describe('.isValidSongAudioLink()', () => {
17
- it('should return true', () => {
18
- assert.isTrue(utils.isValidSongAudioLink('http://localhost:80/audio/hash.mp3'), 'check http and mp3');
19
- assert.isTrue(utils.isValidSongAudioLink('https://192.0.0.1:3000/audio/hash.mpga'), 'check https and mpga');
20
- });
21
-
22
- it('should return false', () => {
23
- assert.isFalse(utils.isValidSongAudioLink('http://localhost/audio/hash'), 'check without an extenstion');
24
- assert.isFalse(utils.isValidSongAudioLink('http://localhost/audio/hash.mp3'), 'check without a port');
25
- assert.isFalse(utils.isValidSongAudioLink('ftp://localhost/audio/hash'), 'check the wrong protocol');
26
- assert.isFalse(utils.isValidSongAudioLink('http://192.0.0.1:80/cover/hash'), 'check the wrong path');
27
- });
28
- });
29
-
30
- describe('.isValidSongCoverLink()', () => {
31
- it('should return true', () => {
32
- assert.isTrue(utils.isValidSongCoverLink('http://localhost:80/cover/hash.jpg'), 'check http and jpg');
33
- assert.isTrue(utils.isValidSongCoverLink('https://192.0.0.1:3000/cover/hash.png'), 'check https and png');
34
- });
35
-
36
- it('should return false', () => {
37
- assert.isFalse(utils.isValidSongCoverLink('http://localhost/cover/hash'), 'check without an extenstion');
38
- assert.isFalse(utils.isValidSongCoverLink('http://localhost/cover/hash.mp3'), 'check without a port');
39
- assert.isFalse(utils.isValidSongCoverLink('ftp://localhost/cover/hash'), 'check the wrong protocol');
40
- assert.isFalse(utils.isValidSongCoverLink('http://192.0.0.1:80/audio/hash'), 'check the wrong path');
41
- });
42
- });
43
-
44
- describe('.beautifySongTitle()', () => {
45
- it('should camalize the title', () => {
46
- assert.equal(utils.beautifySongTitle('artist - good title (feat. artist2)'), 'Artist - Good Title (feat. Artist2)');
1
+ import { assert } from "chai";
2
+ import fse from "fs-extra";
3
+ import path from "path";
4
+ import utils from "../src/utils.js";
5
+ import tools from "./tools.js";
6
+
7
+ export default function () {
8
+ describe('utils', () => {
9
+ describe('.splitSongTitle()', () => {
10
+ it('should return the right array', () => {
11
+ const arr = utils.splitSongTitle('x - a, - b - c');
12
+ assert.equal(arr[0], 'x', 'the first part');
13
+ assert.equal(arr[1], 'a, - b - c', 'the second part');
14
+ });
47
15
  });
48
16
 
49
- it('should remove excess spaces', () => {
50
- const res = utils.beautifySongTitle(' artist - good title ( feat. artist2 ) ( remix ) [2019 ] ( europe)');
51
- assert.equal(res, 'Artist - Good Title (remix) [2019] (europe) (feat. Artist2)');
17
+ describe('.isValidSongAudioLink()', () => {
18
+ it('should return true', () => {
19
+ assert.isTrue(utils.isValidSongAudioLink('http://localhost:80/audio/hash.mp3'), 'check http and mp3');
20
+ assert.isTrue(utils.isValidSongAudioLink('https://192.0.0.1:3000/audio/hash.mpga'), 'check https and mpga');
21
+ });
22
+
23
+ it('should return false', () => {
24
+ assert.isFalse(utils.isValidSongAudioLink('http://localhost/audio/hash'), 'check without an extenstion');
25
+ assert.isFalse(utils.isValidSongAudioLink('http://localhost/audio/hash.mp3'), 'check without a port');
26
+ assert.isFalse(utils.isValidSongAudioLink('ftp://localhost/audio/hash'), 'check the wrong protocol');
27
+ assert.isFalse(utils.isValidSongAudioLink('http://192.0.0.1:80/cover/hash'), 'check the wrong path');
28
+ });
52
29
  });
53
30
 
54
- it('should remove links', () => {
55
- const res = utils.beautifySongTitle('почта.рф artist google.com - mail.com good www.mail.ru title http://example.ru');
56
- assert.equal(res, 'Artist - Good Title');
31
+ describe('.isValidSongCoverLink()', () => {
32
+ it('should return true', () => {
33
+ assert.isTrue(utils.isValidSongCoverLink('http://localhost:80/cover/hash.jpg'), 'check http and jpg');
34
+ assert.isTrue(utils.isValidSongCoverLink('https://192.0.0.1:3000/cover/hash.png'), 'check https and png');
35
+ });
36
+
37
+ it('should return false', () => {
38
+ assert.isFalse(utils.isValidSongCoverLink('http://localhost/cover/hash'), 'check without an extenstion');
39
+ assert.isFalse(utils.isValidSongCoverLink('http://localhost/cover/hash.mp3'), 'check without a port');
40
+ assert.isFalse(utils.isValidSongCoverLink('ftp://localhost/cover/hash'), 'check the wrong protocol');
41
+ assert.isFalse(utils.isValidSongCoverLink('http://192.0.0.1:80/audio/hash'), 'check the wrong path');
42
+ });
57
43
  });
58
44
 
59
- it('should remove empty braces', () => {
60
- const res = utils.beautifySongTitle('artist [] - () title');
61
- assert.equal(res, 'Artist - Title');
45
+ describe('.beautifySongTitle()', () => {
46
+ it('should camalize the title', () => {
47
+ assert.equal(utils.beautifySongTitle('artist - good title (feat. artist2)'), 'Artist - Good Title (feat. Artist2)');
48
+ });
49
+
50
+ it('should remove excess spaces', () => {
51
+ const res = utils.beautifySongTitle(' artist - good title ( feat. artist2 ) ( remix ) [2019 ] ( europe)');
52
+ assert.equal(res, 'Artist - Good Title (remix) [2019] (europe) (feat. Artist2)');
53
+ });
54
+
55
+ it('should remove links', () => {
56
+ const res = utils.beautifySongTitle('почта.рф artist google.com - mail.com good www.mail.ru title http://example.ru');
57
+ assert.equal(res, 'Artist - Good Title');
58
+ });
59
+
60
+ it('should remove empty braces', () => {
61
+ const res = utils.beautifySongTitle('artist [] - () title');
62
+ assert.equal(res, 'Artist - Title');
63
+ });
64
+
65
+ it('should keep unusual signs but remove emojis and slashes', () => {
66
+ assert.equal(utils.beautifySongTitle(`MrkeyØ - #$-&^@+_*&%'.\\/Song 😀 good`), `Mrkeyø - #$-&^@+_*&%'.\\/song Good`);
67
+ });
68
+
69
+ it('should place feats together', () => {
70
+ const res = utils.beautifySongTitle('artist1, artist2,artist3 - title (feat. artist4, artist5,artist6)');
71
+ assert.equal(res, 'Artist1 - Title (feat. Artist2, Artist3, Artist4, Artist5, Artist6)');
72
+ });
73
+
74
+ it('should bring all feats to a single form', () => {
75
+ assert.equal(utils.beautifySongTitle('artist - title (ft. Artist)'), 'Artist - Title (feat. Artist)', 'check "ft"');
76
+ assert.equal(utils.beautifySongTitle('artist - title (feat. Artist)'), 'Artist - Title (feat. Artist)', 'check "feat"');
77
+ assert.equal(utils.beautifySongTitle('artist - title ft. Artist'), 'Artist - Title (feat. Artist)', 'check without brackets');
78
+ });
79
+
80
+ it('should change the dash type', () => {
81
+ assert.equal(utils.beautifySongTitle('artist — title'), 'Artist - Title', 'check the long dash');
82
+ assert.equal(utils.beautifySongTitle('artist – title'), 'Artist - Title', 'check the short dash');
83
+ });
84
+
85
+ it('should return an empty string', () => {
86
+ assert.isEmpty(utils.beautifySongTitle('wrong song title'), 'check the wrong title');
87
+ assert.isEmpty(utils.beautifySongTitle(' - no song artist'), 'check the wrong artist');
88
+ });
62
89
  });
63
90
 
64
- it('should keep unusual signs but remove emojis and slashes', () => {
65
- assert.equal(utils.beautifySongTitle(`MrkeyØ - #$-&^@+_*&%'.\\/Song 😀 good`), `Mrkeyø - #$-&^@+_*&%'.\\/song Good`);
91
+ describe('.isSongTitle()', () => {
92
+ it('should return true', () => {
93
+ assert.isTrue(utils.isSongTitle('artist - title'), 'check the simple case');
94
+ assert.isTrue(utils.isSongTitle('artist - title (ft. artist, artist2)'), 'check with the feats');
95
+ assert.isTrue(utils.isSongTitle('artist, artist2 - title (ft. artist)'), 'check with the feats in the beginning');
96
+ assert.isTrue(utils.isSongTitle('artist - title (remix) (ft. artist2)'), 'check the additional info');
97
+ });
98
+
99
+ it('should return false', () => {
100
+ assert.isFalse(utils.isSongTitle({}), 'check an object');
101
+ assert.isFalse(utils.isSongTitle(0), 'check an integer');
102
+ assert.isFalse(utils.isSongTitle('wrong'), 'check without dash');
103
+ assert.isFalse(utils.isSongTitle('wrong title -'), 'check without a name');
104
+ assert.isFalse(utils.isSongTitle('artist -title'), 'check without spaces');
105
+ });
66
106
  });
67
107
 
68
- it('should place feats together', () => {
69
- const res = utils.beautifySongTitle('artist1, artist2,artist3 - title (feat. artist4, artist5,artist6)');
70
- assert.equal(res, 'Artist1 - Title (feat. Artist2, Artist3, Artist4, Artist5, Artist6)');
71
- });
108
+ describe('.getSongName()', () => {
109
+ it('should return an empty string because of a wrong title', () => {
110
+ assert.isEmpty(utils.getSongName('artist'));
111
+ });
72
112
 
73
- it('should bring all feats to a single form', () => {
74
- assert.equal(utils.beautifySongTitle('artist - title (ft. Artist)'), 'Artist - Title (feat. Artist)', 'check "ft"');
75
- assert.equal(utils.beautifySongTitle('artist - title (feat. Artist)'), 'Artist - Title (feat. Artist)', 'check "feat"');
76
- assert.equal(utils.beautifySongTitle('artist - title ft. Artist'), 'Artist - Title (feat. Artist)', 'check without brackets');
77
- });
113
+ it('should return the right name in simple case', () => {
114
+ assert.equal(utils.getSongName('artist - title'), 'Title');
115
+ });
78
116
 
79
- it('should change the dash type', () => {
80
- assert.equal(utils.beautifySongTitle('artist title'), 'Artist - Title', 'check the long dash');
81
- assert.equal(utils.beautifySongTitle('artist – title'), 'Artist - Title', 'check the short dash');
82
- });
117
+ it('should return the right name with feats', () => {
118
+ assert.equal(utils.getSongName('artist - title ft. artist2, artist3'), 'Title');
119
+ });
83
120
 
84
- it('should return an empty string', () => {
85
- assert.isEmpty(utils.beautifySongTitle('wrong song title'), 'check the wrong title');
86
- assert.isEmpty(utils.beautifySongTitle(' - no song artist'), 'check the wrong artist');
87
- });
88
- });
121
+ it('should return the right name with a lot artists', () => {
122
+ assert.equal(utils.getSongName('artist, artist2 - title ft. artist3, artist4'), 'Title');
123
+ });
89
124
 
90
- describe('.isSongTitle()', () => {
91
- it('should return true', () => {
92
- assert.isTrue(utils.isSongTitle('artist - title'), 'check the simple case');
93
- assert.isTrue(utils.isSongTitle('artist - title (ft. artist, artist2)'), 'check with the feats');
94
- assert.isTrue(utils.isSongTitle('artist, artist2 - title (ft. artist)'), 'check with the feats in the beginning');
95
- assert.isTrue(utils.isSongTitle('artist - title (remix) (ft. artist2)'), 'check the additional info');
96
- });
97
-
98
- it('should return false', () => {
99
- assert.isFalse(utils.isSongTitle({}), 'check an object');
100
- assert.isFalse(utils.isSongTitle(0), 'check an integer');
101
- assert.isFalse(utils.isSongTitle('wrong'), 'check without dash');
102
- assert.isFalse(utils.isSongTitle('wrong title -'), 'check without a name');
103
- assert.isFalse(utils.isSongTitle('artist -title'), 'check without spaces');
125
+ it('should return the right name with additional data', () => {
126
+ assert.equal(utils.getSongName('artist - song title (remix) [1999]'), 'Song Title (remix) [1999]');
127
+ });
104
128
  });
105
- });
106
-
107
- describe('.getSongName()', () => {
108
- it('should return an empty string because of a wrong title', () => {
109
- assert.isEmpty(utils.getSongName('artist'));
110
- });
111
129
 
112
- it('should return the right name in simple case', () => {
113
- assert.equal(utils.getSongName('artist - title'), 'Title');
114
- });
115
-
116
- it('should return the right name with feats', () => {
117
- assert.equal(utils.getSongName('artist - title ft. artist2, artist3'), 'Title');
118
- });
119
-
120
- it('should return the right name with a lot artists', () => {
121
- assert.equal(utils.getSongName('artist, artist2 - title ft. artist3, artist4'), 'Title');
122
- });
123
-
124
- it('should return the right name with additional data', () => {
125
- assert.equal(utils.getSongName('artist - song title (remix) [1999]'), 'Song Title (remix) [1999]');
126
- });
127
- });
128
-
129
- describe('.getSongArtists()', () => {
130
- it('should return an empty array because of a wrong title', () => {
131
- assert.lengthOf(utils.getSongArtists('artist'), 0);
132
- });
130
+ describe('.getSongArtists()', () => {
131
+ it('should return an empty array because of a wrong title', () => {
132
+ assert.lengthOf(utils.getSongArtists('artist'), 0);
133
+ });
133
134
 
134
- it('should return the right array', () => {
135
- const artists = utils.getSongArtists('artist,artist2 - title ft. artist3, artist4');
136
- assert.equal(artists.join(','), 'Artist,Artist2,Artist3,Artist4');
135
+ it('should return the right array', () => {
136
+ const artists = utils.getSongArtists('artist,artist2 - title ft. artist3, artist4');
137
+ assert.equal(artists.join(','), 'Artist,Artist2,Artist3,Artist4');
138
+ });
137
139
  });
138
- });
139
140
 
140
- describe('.getSongSimilarity()', () => {
141
- it('should return 0 because of wrong titles', () => {
142
- assert.equal(utils.getSongSimilarity('wrong', 'artist - title'), 0, 'check the wrong first argument');
143
- assert.equal(utils.getSongSimilarity('artist - title', 'wrong'), 0, 'check the wrong secong argument');
144
- });
141
+ describe('.getSongSimilarity()', () => {
142
+ it('should return 0 because of wrong titles', () => {
143
+ assert.equal(utils.getSongSimilarity('wrong', 'artist - title'), 0, 'check the wrong first argument');
144
+ assert.equal(utils.getSongSimilarity('artist - title', 'wrong'), 0, 'check the wrong secong argument');
145
+ });
145
146
 
146
- it('should return 1', () => {
147
- assert.equal(utils.getSongSimilarity('Artist - Title', 'artist - title'), 1);
148
- });
147
+ it('should return 1', () => {
148
+ assert.equal(utils.getSongSimilarity('Artist - Title', 'artist - title'), 1);
149
+ });
149
150
 
150
- it('should return > 0.8', () => {
151
- const res = utils.getSongSimilarity('Artist - Title', 'artist - title 1');
152
- assert.isTrue(res > 0.8 && res < 1);
151
+ it('should return > 0.8', () => {
152
+ const res = utils.getSongSimilarity('Artist - Title', 'artist - title 1');
153
+ assert.isTrue(res > 0.8 && res < 1);
154
+ });
153
155
  });
154
- });
155
-
156
- describe('.prepareSongTagsToGet()', () => {
157
- it('should return buffer APIC', async () => {
158
- const tags = {
159
- APIC: {
160
- imageBuffer: Buffer.from('1')
161
- }
162
- };
163
- const res = await utils.prepareSongTagsToGet(tags);
164
- assert.instanceOf(res.APIC, Buffer);
165
- });
166
- });
167
-
168
- describe('.prepareSongTagsToSet()', () => {
169
- it('should change "image" to "APIC"', async () => {
170
- const val = Buffer.from('1');
171
- const tags = { image: val };
172
- const res = await utils.prepareSongTagsToSet(tags);
173
- assert.strictEqual(res.APIC, val);
174
- });
175
-
176
- it('should change fs.ReadStream to a string path', async () => {
177
- const val = path.join(tools.tmpPath, 'audio.mp3');
178
- const tags = { APIC: fse.createReadStream(val) };
179
- const res = await utils.prepareSongTagsToSet(tags);
180
- assert.equal(res.APIC, val);
181
- });
182
- });
183
156
 
184
- describe('.encodeSongTitle()', () => {
185
- it('should include right symbols', () => {
186
- const res = utils.encodeSongTitle(`${ Math.random() } - ${ Math.random() }`);
187
- assert.match(res, /[a-z0-9_]/i);
188
- });
189
- });
190
-
191
- describe('.decodeSongTitle()', () => {
192
- it('should include right symbols', () => {
193
- const title = 'artist - title';
194
- const res = utils.encodeSongTitle(title);
195
- assert.equal(utils.decodeSongTitle(res), title);
196
- });
197
- });
198
-
199
- describe('tags manipulation', () => {
200
- it('should set the tags', async () => {
201
- const file = path.join(tools.tmpPath, 'audio.mp3');
202
- const title = 'artist - title';
203
- const tags = { fullTitle: title };
204
- await utils.setSongTags(file, tags)
205
- const res = await utils.getSongTags(file);
206
- assert.equal(res.fullTitle, utils.beautifySongTitle(title), 'check the title');
207
- assert.lengthOf(Object.keys(res), 2, 'check the length');
208
- });
209
-
210
- it('should reset the tags', async () => {
211
- const file = path.join(tools.tmpPath, 'audio.mp3');
212
- const title = 'artist - title';
213
- const tags = { TIT3: title };
214
- await utils.setSongTags(file, tags)
215
- const res = await utils.getSongTags(file);
216
- assert.equal(res.TIT3, title, 'check the title');
217
- assert.lengthOf(Object.keys(res), 1, 'check the length');
157
+ describe('.prepareSongTagsToGet()', () => {
158
+ it('should return buffer APIC', async () => {
159
+ const tags = {
160
+ APIC: {
161
+ imageBuffer: Buffer.from('1')
162
+ }
163
+ };
164
+ const res = await utils.prepareSongTagsToGet(tags);
165
+ assert.instanceOf(res.APIC, Buffer);
166
+ });
218
167
  });
219
168
 
220
- it('should add the tags', async () => {
221
- const file = path.join(tools.tmpPath, 'audio.mp3');
222
- const tags = { TIT1: '1', TIT2: '2' };
223
- await utils.addSongTags(file, tags)
224
- const res = await utils.getSongTags(file);
225
- assert.equal(res.TIT3, 'artist - title', 'check the TIT3');
226
- assert.equal(res.TIT1, tags.TIT1, 'check the TIT1');
227
- assert.equal(res.TIT2, tags.TIT2, 'check the TIT2');
169
+ describe('.prepareSongTagsToSet()', () => {
170
+ it('should change "image" to "APIC"', async () => {
171
+ const val = Buffer.from('1');
172
+ const tags = { image: val };
173
+ const res = await utils.prepareSongTagsToSet(tags);
174
+ assert.strictEqual(res.APIC, val);
175
+ });
176
+
177
+ it('should change fse.ReadStream to a string path', async () => {
178
+ const val = path.join(tools.tmpPath, 'audio.mp3');
179
+ const tags = { APIC: fse.createReadStream(val) };
180
+ const res = await utils.prepareSongTagsToSet(tags);
181
+ assert.equal(res.APIC, val);
182
+ });
228
183
  });
229
184
 
230
- it('should merge the tags', async () => {
231
- const source = { fullTitle: 'Artist - Song', XXX: 'x', TIT3: 'z' };
232
- const dest = { TIT2: 'Song1', TPE1: 'Artist1', YYY: 'y' };
233
- const tags = await utils.mergeSongTags(source, dest);
234
- assert.equal(tags.fullTitle, utils.beautifySongTitle(dest.TPE1 + ' - ' + dest.TIT2), 'check the full title');
235
- assert.equal(tags.TIT3, 'z', 'check the source keys');
236
- assert.equal(tags.YYY, 'y', 'check the dest keys');
237
- assert.isUndefined(tags.XXX, 'check the inheritance');
185
+ describe('.encodeSongTitle()', () => {
186
+ it('should include right symbols', () => {
187
+ const res = utils.encodeSongTitle(`${Math.random()} - ${Math.random()}`);
188
+ assert.match(res, /[a-z0-9_]/i);
189
+ });
238
190
  });
239
191
 
240
- it('should remove the tags', async () => {
241
- const file = path.join(tools.tmpPath, 'audio.mp3');
242
- await utils.removeSongTags(file)
243
- const res = await utils.getSongTags(file);
244
- assert.lengthOf(Object.keys(res), 0);
192
+ describe('.decodeSongTitle()', () => {
193
+ it('should include right symbols', () => {
194
+ const title = 'artist - title';
195
+ const res = utils.encodeSongTitle(title);
196
+ assert.equal(utils.decodeSongTitle(res), title);
197
+ });
245
198
  });
246
- });
247
199
 
248
- describe('.getSongMetadata()', () => {
249
- it('should return a right object from the file path', async () => {
250
- const res = await utils.getSongMetadata(path.join(tools.tmpPath, 'audio.mp3'));
251
- assert.containsAllKeys(res, ['bitrate', 'duration', 'sampleRate']);
200
+ describe('tags manipulation', () => {
201
+ it('should set the tags', async () => {
202
+ const file = path.join(tools.tmpPath, 'audio.mp3');
203
+ const title = 'artist - title';
204
+ const tags = { fullTitle: title };
205
+ await utils.setSongTags(file, tags);
206
+ const res = await utils.getSongTags(file);
207
+ assert.equal(res.fullTitle, utils.beautifySongTitle(title), 'check the title');
208
+ assert.lengthOf(Object.keys(res), 2, 'check the length');
209
+ });
210
+
211
+ it('should reset the tags', async () => {
212
+ const file = path.join(tools.tmpPath, 'audio.mp3');
213
+ const title = 'artist - title';
214
+ const tags = { TIT3: title };
215
+ await utils.setSongTags(file, tags);
216
+ const res = await utils.getSongTags(file);
217
+ assert.equal(res.TIT3, title, 'check the title');
218
+ assert.lengthOf(Object.keys(res), 1, 'check the length');
219
+ });
220
+
221
+ it('should add the tags', async () => {
222
+ const file = path.join(tools.tmpPath, 'audio.mp3');
223
+ const tags = { TIT1: '1', TIT2: '2' };
224
+ await utils.addSongTags(file, tags);
225
+ const res = await utils.getSongTags(file);
226
+ assert.equal(res.TIT3, 'artist - title', 'check the TIT3');
227
+ assert.equal(res.TIT1, tags.TIT1, 'check the TIT1');
228
+ assert.equal(res.TIT2, tags.TIT2, 'check the TIT2');
229
+ });
230
+
231
+ it('should merge the tags', async () => {
232
+ const source = { fullTitle: 'Artist - Song', XXX: 'x', TIT3: 'z' };
233
+ const dest = { TIT2: 'Song1', TPE1: 'Artist1', YYY: 'y' };
234
+ const tags = await utils.mergeSongTags(source, dest);
235
+ assert.equal(tags.fullTitle, utils.beautifySongTitle(dest.TPE1 + ' - ' + dest.TIT2), 'check the full title');
236
+ assert.equal(tags.TIT3, 'z', 'check the source keys');
237
+ assert.equal(tags.YYY, 'y', 'check the dest keys');
238
+ assert.isUndefined(tags.XXX, 'check the inheritance');
239
+ });
240
+
241
+ it('should remove the tags', async () => {
242
+ const file = path.join(tools.tmpPath, 'audio.mp3');
243
+ await utils.removeSongTags(file);
244
+ const res = await utils.getSongTags(file);
245
+ assert.lengthOf(Object.keys(res), 0);
246
+ });
252
247
  });
253
248
 
254
- it('should return a right object from the buffer', async () => {
255
- const res = await utils.getSongMetadata(await fse.readFile(path.join(tools.tmpPath, 'audio.mp3')));
256
- assert.containsAllKeys(res, ['bitrate', 'duration', 'sampleRate']);
249
+ describe('.getSongMetadata()', () => {
250
+ it('should return a right object from the file path', async () => {
251
+ const res = await utils.getSongMetadata(path.join(tools.tmpPath, 'audio.mp3'));
252
+ assert.containsAllKeys(res, ['bitrate', 'duration', 'sampleRate']);
253
+ });
254
+
255
+ it('should return a right object from the buffer', async () => {
256
+ const res = await utils.getSongMetadata(await fse.readFile(path.join(tools.tmpPath, 'audio.mp3')));
257
+ assert.containsAllKeys(res, ['bitrate', 'duration', 'sampleRate']);
258
+ });
259
+
260
+ it('should return a right object from the file stream', async () => {
261
+ const res = await utils.getSongMetadata(fse.createReadStream(path.join(tools.tmpPath, 'audio.mp3')));
262
+ assert.containsAllKeys(res, ['bitrate', 'duration', 'sampleRate']);
263
+ });
257
264
  });
258
-
259
- it('should return a right object from the file stream', async () => {
260
- const res = await utils.getSongMetadata(fse.createReadStream(path.join(tools.tmpPath, 'audio.mp3')));
261
- assert.containsAllKeys(res, ['bitrate', 'duration', 'sampleRate']);
265
+
266
+ describe('.normalizeString()', () => {
267
+ it('should remove accents', () => {
268
+ assert.equal(utils.normalizeString('Mylène Farmer'), 'Mylene Farmer');
269
+ });
262
270
  });
263
271
  });
264
-
265
- describe('.normalizeString()', () => {
266
- it('should remove accents', () => {
267
- assert.equal(utils.normalizeString('Mylène Farmer'), 'Mylene Farmer');
268
- });
269
- });
270
- });
272
+ }
package/webpack.client.js CHANGED
@@ -1,16 +1,18 @@
1
- const path = require('path');
2
- const merge = require('lodash/merge');
3
- const stWebpackConfig = require('storacle/webpack.client.js');
4
- const mtWebpackConfig = require('metastocle/webpack.client.js');
1
+ import path from "path";
2
+ import merge from "lodash-es/merge.js";
3
+ import stWebpackConfig from "storacle/webpack.client.js";
4
+ import mtWebpackConfig from "metastocle/webpack.client.js";
5
5
 
6
- module.exports = (options = {}, wp) => {
6
+ const __dirname = new URL('.', import.meta.url).pathname;
7
+
8
+ export default (options = {}, wp) => {
7
9
  options = merge({
8
10
  include: [],
9
11
  mock: {
10
12
  'music-metadata': true,
11
13
  'base64url': true
12
- }
14
+ }
13
15
  }, options);
14
16
  options.include.push([path.resolve(__dirname, 'src/browser/client')]);
15
17
  return wp? mtWebpackConfig(stWebpackConfig(options), wp): options;
16
- };
18
+ };
package/webpack.face.js CHANGED
@@ -1,15 +1,17 @@
1
- const path = require('path');
2
- const merge = require('lodash/merge');
3
- const spWebpackConfig = require('spreadable/webpack.common.js');
1
+ import path from "path";
2
+ import merge from "lodash-es/merge.js";
3
+ import spWebpackConfig from "spreadable/webpack.common.js";
4
4
 
5
- module.exports = (options = {}, wp) => {
5
+ const __dirname = new URL('.', import.meta.url).pathname;
6
+
7
+ export default (options = {}, wp) => {
6
8
  options = merge({
7
9
  name: 'face',
8
- include: []
10
+ include: []
9
11
  }, options);
10
12
  options.include.push([
11
13
  path.resolve(__dirname, 'src/browser/face'),
12
14
  path.resolve(__dirname, 'node_modules/akili')
13
15
  ]);
14
16
  return wp? spWebpackConfig(options, wp): options;
15
- };
17
+ };
Binary file