@emgeebee/music_downcoder 1.1.7 → 1.1.9

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.
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export declare const cleanEncoderOutputFolders: (configPath?: string) => number;
3
+ //# sourceMappingURL=cleanEmptyFolders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanEmptyFolders.d.ts","sourceRoot":"","sources":["../src/cleanEmptyFolders.ts"],"names":[],"mappings":";AAyFA,eAAO,MAAM,yBAAyB,GAAI,aAAa,MAAM,KAAG,MAgC/D,CAAC"}
@@ -0,0 +1,111 @@
1
+ #!/usr/bin/env node
2
+ import fs from "fs";
3
+ import path from "path";
4
+ import { getConfig, loadConfig } from "./config.js";
5
+ import { normalizeDir } from "./paths.js";
6
+ const MEDIA_EXTENSIONS = new Set([
7
+ ".mp3",
8
+ ".ogg",
9
+ ".m4a",
10
+ ".flac",
11
+ ".wav",
12
+ ".aac",
13
+ ".wma",
14
+ ".opus",
15
+ ".aiff",
16
+ ".aif",
17
+ ]);
18
+ const isMediaFile = (filename) => MEDIA_EXTENSIONS.has(path.extname(filename).toLowerCase());
19
+ const formatError = (error) => error instanceof Error ? error.message : String(error);
20
+ const logAccessError = (action, dirPath, error) => {
21
+ console.warn(`Could not ${action} ${dirPath}: ${formatError(error)}`);
22
+ };
23
+ const directoryHasMedia = (dirPath) => {
24
+ let entries;
25
+ try {
26
+ entries = fs.readdirSync(dirPath, { withFileTypes: true });
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ for (const entry of entries) {
32
+ const fullPath = path.join(dirPath, entry.name);
33
+ if (entry.isDirectory()) {
34
+ if (directoryHasMedia(fullPath)) {
35
+ return true;
36
+ }
37
+ continue;
38
+ }
39
+ if (isMediaFile(entry.name)) {
40
+ return true;
41
+ }
42
+ }
43
+ return false;
44
+ };
45
+ const cleanEmptyDirectories = (dirPath) => {
46
+ if (!fs.existsSync(dirPath)) {
47
+ return 0;
48
+ }
49
+ let removed = 0;
50
+ let entries;
51
+ try {
52
+ entries = fs.readdirSync(dirPath, { withFileTypes: true });
53
+ }
54
+ catch (error) {
55
+ logAccessError("read", dirPath, error);
56
+ return 0;
57
+ }
58
+ for (const entry of entries) {
59
+ if (!entry.isDirectory()) {
60
+ continue;
61
+ }
62
+ removed += cleanEmptyDirectories(path.join(dirPath, entry.name));
63
+ }
64
+ if (!directoryHasMedia(dirPath)) {
65
+ try {
66
+ fs.rmSync(dirPath, { recursive: true, force: true });
67
+ console.log(`Removed ${dirPath}`);
68
+ return removed + 1;
69
+ }
70
+ catch (error) {
71
+ logAccessError("remove", dirPath, error);
72
+ return removed;
73
+ }
74
+ }
75
+ return removed;
76
+ };
77
+ export const cleanEncoderOutputFolders = (configPath) => {
78
+ loadConfig(configPath ? path.resolve(configPath) : undefined);
79
+ const config = getConfig();
80
+ const outputRoots = [
81
+ ...new Set(config.encoders.map((encoder) => normalizeDir(encoder.out))),
82
+ ];
83
+ let removed = 0;
84
+ for (const outputRoot of outputRoots) {
85
+ if (!fs.existsSync(outputRoot)) {
86
+ console.log(`Skipping missing folder: ${outputRoot}`);
87
+ continue;
88
+ }
89
+ console.log(`Cleaning ${outputRoot}...`);
90
+ let entries;
91
+ try {
92
+ entries = fs.readdirSync(outputRoot, { withFileTypes: true });
93
+ }
94
+ catch (error) {
95
+ logAccessError("read", outputRoot, error);
96
+ continue;
97
+ }
98
+ for (const entry of entries) {
99
+ if (!entry.isDirectory()) {
100
+ continue;
101
+ }
102
+ removed += cleanEmptyDirectories(path.join(outputRoot, entry.name));
103
+ }
104
+ }
105
+ return removed;
106
+ };
107
+ const configArgIndex = process.argv.indexOf("-c");
108
+ const configPath = configArgIndex >= 0 ? process.argv[configArgIndex + 1] : undefined;
109
+ const removed = cleanEncoderOutputFolders(configPath);
110
+ console.log(`Removed ${removed} empty folder(s).`);
111
+ //# sourceMappingURL=cleanEmptyFolders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanEmptyFolders.js","sourceRoot":"","sources":["../src/cleanEmptyFolders.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAUA,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAgBA,OAAO,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -3,6 +3,15 @@ const [command] = process.argv.slice(2);
3
3
  if (command === "serve") {
4
4
  await import("./serve.js");
5
5
  }
6
+ else if (command === "clean-empty") {
7
+ await import("./cleanEmptyFolders.js");
8
+ }
9
+ else if (command === "sync-meta") {
10
+ await import("./syncMetaFromLocal.js");
11
+ }
12
+ else if (command === "repair-meta-years") {
13
+ await import("./repairMetaYears.js");
14
+ }
6
15
  else {
7
16
  await import("./cli.js");
8
17
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAExC,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;IACxB,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;AAC7B,CAAC;KAAM,CAAC;IACN,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAExC,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;IACxB,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;AAC7B,CAAC;KAAM,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;IACrC,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;AACzC,CAAC;KAAM,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;IACnC,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;AACzC,CAAC;KAAM,IAAI,OAAO,KAAK,mBAAmB,EAAE,CAAC;IAC3C,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;AACvC,CAAC;KAAM,CAAC;IACN,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare const sanitiseMeta: (meta: string) => string;
2
+ export declare const sanitisePathSegment: (segment: string) => string;
3
+ export declare const buildArtistDirName: (fullArtist: string) => string;
4
+ export declare const buildArtistOutputDir: (outputRoot: string, genre: string, fullArtist: string) => string;
5
+ export interface AlbumFolderMatch {
6
+ folderName: string;
7
+ year: string;
8
+ }
9
+ export declare const findAlbumFolderOnDisk: (artistDir: string, albumName: string) => AlbumFolderMatch | null;
10
+ //# sourceMappingURL=outputPaths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outputPaths.d.ts","sourceRoot":"","sources":["../src/outputPaths.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,MACC,CAAC;AAE9C,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,KAAG,MACxB,CAAC;AAE/B,eAAO,MAAM,kBAAkB,GAAI,YAAY,MAAM,KAAG,MAGnB,CAAC;AAEtC,eAAO,MAAM,oBAAoB,GAC/B,YAAY,MAAM,EAClB,OAAO,MAAM,EACb,YAAY,MAAM,KACjB,MAKA,CAAC;AAKJ,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,qBAAqB,GAChC,WAAW,MAAM,EACjB,WAAW,MAAM,KAChB,gBAAgB,GAAG,IAgCrB,CAAC"}
@@ -0,0 +1,36 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ export const sanitiseMeta = (meta) => meta.replace(/\//g, "_").replace(/:/g, "_");
4
+ export const sanitisePathSegment = (segment) => sanitiseMeta(segment).trim();
5
+ export const buildArtistDirName = (fullArtist) => fullArtist === "Various Artists"
6
+ ? "Compilations"
7
+ : sanitisePathSegment(fullArtist);
8
+ export const buildArtistOutputDir = (outputRoot, genre, fullArtist) => path.join(outputRoot, sanitisePathSegment(genre), buildArtistDirName(fullArtist));
9
+ const escapeRegex = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
10
+ export const findAlbumFolderOnDisk = (artistDir, albumName) => {
11
+ if (!fs.existsSync(artistDir)) {
12
+ return null;
13
+ }
14
+ const sanitisedAlbum = sanitisePathSegment(albumName);
15
+ const escapedAlbum = escapeRegex(sanitisedAlbum);
16
+ const yearPrefixPattern = new RegExp(`^\\((\\d{4})\\)\\s+${escapedAlbum}$`, "i");
17
+ const plainPattern = new RegExp(`^${escapedAlbum}$`, "i");
18
+ let plainMatch = null;
19
+ for (const entry of fs.readdirSync(artistDir, { withFileTypes: true })) {
20
+ if (!entry.isDirectory()) {
21
+ continue;
22
+ }
23
+ const yearMatch = entry.name.match(yearPrefixPattern);
24
+ if (yearMatch) {
25
+ return { folderName: entry.name, year: yearMatch[1] };
26
+ }
27
+ if (plainPattern.test(entry.name)) {
28
+ plainMatch = entry.name;
29
+ }
30
+ }
31
+ if (plainMatch) {
32
+ return { folderName: plainMatch, year: "" };
33
+ }
34
+ return null;
35
+ };
36
+ //# sourceMappingURL=outputPaths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outputPaths.js","sourceRoot":"","sources":["../src/outputPaths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAU,EAAE,CACnD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAE9C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAU,EAAE,CAC7D,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AAE/B,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,UAAkB,EAAU,EAAE,CAC/D,UAAU,KAAK,iBAAiB;IAC9B,CAAC,CAAC,cAAc;IAChB,CAAC,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,UAAkB,EAClB,KAAa,EACb,UAAkB,EACV,EAAE,CACV,IAAI,CAAC,IAAI,CACP,UAAU,EACV,mBAAmB,CAAC,KAAK,CAAC,EAC1B,kBAAkB,CAAC,UAAU,CAAC,CAC/B,CAAC;AAEJ,MAAM,WAAW,GAAG,CAAC,KAAa,EAAU,EAAE,CAC5C,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAO/C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,SAAiB,EACjB,SAAiB,EACQ,EAAE;IAC3B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,cAAc,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;IACjD,MAAM,iBAAiB,GAAG,IAAI,MAAM,CAAC,sBAAsB,YAAY,GAAG,EAAE,GAAG,CAAC,CAAC;IACjF,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC,IAAI,YAAY,GAAG,EAAE,GAAG,CAAC,CAAC;IAE1D,IAAI,UAAU,GAAkB,IAAI,CAAC;IAErC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACtD,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,CAAC;QAED,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAC9C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
package/dist/paths.d.ts CHANGED
@@ -8,4 +8,6 @@ export declare const relativeFrom: (baseDir: string, fullPath: string) => string
8
8
  export declare const normalizeTerminalOutput: (output: string) => string;
9
9
  /** Join path segments for ffmpeg shell commands (always POSIX-style slashes). */
10
10
  export declare const shellPath: (...segments: string[]) => string;
11
+ /** Quote a path for use in generated bash scripts. */
12
+ export declare const shellQuote: (value: string) => string;
11
13
  //# sourceMappingURL=paths.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAEA,+DAA+D;AAC/D,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,KAAG,MAG9C,CAAC;AAEF,sFAAsF;AACtF,eAAO,MAAM,iBAAiB,GAC5B,WAAW,MAAM,EACjB,OAAO,MAAM,KACZ,MAEF,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,EAAE,UAAU,MAAM,KAAG,MAQhE,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,uBAAuB,GAAI,QAAQ,MAAM,KAAG,MAM9C,CAAC;AAEZ,iFAAiF;AACjF,eAAO,MAAM,SAAS,GAAI,GAAG,UAAU,MAAM,EAAE,KAAG,MACN,CAAC"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAEA,+DAA+D;AAC/D,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,KAAG,MAG9C,CAAC;AAEF,sFAAsF;AACtF,eAAO,MAAM,iBAAiB,GAC5B,WAAW,MAAM,EACjB,OAAO,MAAM,KACZ,MAEF,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,EAAE,UAAU,MAAM,KAAG,MAQhE,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,uBAAuB,GAAI,QAAQ,MAAM,KAAG,MAM9C,CAAC;AAEZ,iFAAiF;AACjF,eAAO,MAAM,SAAS,GAAI,GAAG,UAAU,MAAM,EAAE,KAAG,MACN,CAAC;AAE7C,sDAAsD;AACtD,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,MACY,CAAC"}
package/dist/paths.js CHANGED
@@ -23,4 +23,6 @@ export const normalizeTerminalOutput = (output) => output
23
23
  .trim();
24
24
  /** Join path segments for ffmpeg shell commands (always POSIX-style slashes). */
25
25
  export const shellPath = (...segments) => path.join(...segments).replace(/\\/g, "/");
26
+ /** Quote a path for use in generated bash scripts. */
27
+ export const shellQuote = (value) => `"${value.replace(/\\/g, "/").replace(/"/g, '\\"')}"`;
26
28
  //# sourceMappingURL=paths.js.map
package/dist/paths.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,+DAA+D;AAC/D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAe,EAAU,EAAE;IACtD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC;AACzD,CAAC,CAAC;AAEF,sFAAsF;AACtF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,SAAiB,EACjB,KAAa,EACL,EAAE,CAAC,YAAY,CACvB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAChE,CAAC;AAEF,0EAA0E;AAC1E,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAe,EAAE,QAAgB,EAAU,EAAE;IACxE,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC3D,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,SAAS,QAAQ,gCAAgC,OAAO,GAAG,CAC5D,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,gFAAgF;AAChF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,MAAc,EAAU,EAAE,CAChE,MAAM;KACH,KAAK,CAAC,IAAI,CAAC;KACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;KAC7C,IAAI,CAAC,IAAI,CAAC;KACV,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;KAC1B,IAAI,EAAE,CAAC;AAEZ,iFAAiF;AACjF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,GAAG,QAAkB,EAAU,EAAE,CACzD,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,+DAA+D;AAC/D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAe,EAAU,EAAE;IACtD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC;AACzD,CAAC,CAAC;AAEF,sFAAsF;AACtF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,SAAiB,EACjB,KAAa,EACL,EAAE,CAAC,YAAY,CACvB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAChE,CAAC;AAEF,0EAA0E;AAC1E,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAe,EAAE,QAAgB,EAAU,EAAE;IACxE,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC3D,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,SAAS,QAAQ,gCAAgC,OAAO,GAAG,CAC5D,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,gFAAgF;AAChF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,MAAc,EAAU,EAAE,CAChE,MAAM;KACH,KAAK,CAAC,IAAI,CAAC;KACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;KAC7C,IAAI,CAAC,IAAI,CAAC;KACV,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;KAC1B,IAAI,EAAE,CAAC;AAEZ,iFAAiF;AACjF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,GAAG,QAAkB,EAAU,EAAE,CACzD,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAE7C,sDAAsD;AACtD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAU,EAAE,CAClD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC"}
@@ -8,9 +8,12 @@ interface MetadataCache {
8
8
  interface CommandsMap {
9
9
  [album: string]: string[];
10
10
  }
11
+ interface FoldersByAlbum {
12
+ [album: string]: Set<string>;
13
+ }
11
14
  interface ProcessResults {
12
15
  commands: CommandsMap;
13
- foldersToCreate: string[];
16
+ foldersByAlbum: FoldersByAlbum;
14
17
  metaCache: MetadataCache;
15
18
  }
16
19
  type FileFilter = (name: string) => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"processEncoder.d.ts","sourceRoot":"","sources":["../src/processEncoder.ts"],"names":[],"mappings":";AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAyB5C,UAAU,aAAa;IACrB,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC3B;AAED,UAAU,WAAW;IACnB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC3B;AAED,UAAU,cAAc;IACtB,QAAQ,EAAE,WAAW,CAAC;IACtB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,aAAa,CAAC;CAC1B;AAED,KAAK,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;AAC5C,KAAK,YAAY,CAAC,CAAC,IAAI,CACrB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,KAAK,EAAE,MAAM,EAAE,KACZ,OAAO,CAAC,CAAC,CAAC,CAAC;AAuDhB,eAAO,MAAM,QAAQ,GAAmB,CAAC,EACvC,OAAO,MAAM,EACb,UAAU,YAAY,CAAC,CAAC,CAAC,EACzB,aAAY,UAAuB,KAClC,OAAO,CAAC,CAAC,EAAE,CAqCb,CAAC;AA0QF,eAAO,MAAM,cAAc,GACzB,WAAW,SAAS,EACpB,aAAa,MAAM,EACnB,QAAQ,MAAM,EACd,WAAW,SAAS,EACpB,WAAW,SAAS,EACpB,YAAY,UAAU,EACtB,SAAS,OAAO,KACf,OAAO,CAAC,cAAc,CA8CxB,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,WAAW,SAAS,KAAG,MAAM,EAkB/D,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,WAAW,SAAS,KAAG,IAO5D,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,WAAW,SAAS,KAAG,MAI1D,CAAC"}
1
+ {"version":3,"file":"processEncoder.d.ts","sourceRoot":"","sources":["../src/processEncoder.ts"],"names":[],"mappings":";AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAyB5C,UAAU,aAAa;IACrB,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC3B;AAED,UAAU,WAAW;IACnB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC3B;AAED,UAAU,cAAc;IACtB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;CAC9B;AAED,UAAU,cAAc;IACtB,QAAQ,EAAE,WAAW,CAAC;IACtB,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,aAAa,CAAC;CAC1B;AAED,KAAK,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;AAC5C,KAAK,YAAY,CAAC,CAAC,IAAI,CACrB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,KAAK,EAAE,MAAM,EAAE,KACZ,OAAO,CAAC,CAAC,CAAC,CAAC;AAuDhB,eAAO,MAAM,QAAQ,GAAmB,CAAC,EACvC,OAAO,MAAM,EACb,UAAU,YAAY,CAAC,CAAC,CAAC,EACzB,aAAY,UAAuB,KAClC,OAAO,CAAC,CAAC,EAAE,CAqCb,CAAC;AA8RF,eAAO,MAAM,cAAc,GACzB,WAAW,SAAS,EACpB,aAAa,MAAM,EACnB,QAAQ,MAAM,EACd,WAAW,SAAS,EACpB,WAAW,SAAS,EACpB,YAAY,UAAU,EACtB,SAAS,OAAO,KACf,OAAO,CAAC,cAAc,CAsCxB,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,WAAW,SAAS,KAAG,MAAM,EAkB/D,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,WAAW,SAAS,KAAG,IAO5D,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,WAAW,SAAS,KAAG,MAI1D,CAAC"}
@@ -2,7 +2,7 @@
2
2
  import fs from "fs";
3
3
  import fse from "fs-extra";
4
4
  import path from "path";
5
- import { relativeFrom, normalizeDir } from "./paths.js";
5
+ import { relativeFrom, normalizeDir, shellQuote } from "./paths.js";
6
6
  import { setJobProgress } from "./progress.js";
7
7
  const pathSanitiser = (i) => i.replace(/[`\$\"]/g, "\\$&");
8
8
  const sanitiseMeta = (meta) => meta.replace(/\//g, "_").replace(/:/g, "_");
@@ -132,7 +132,7 @@ const checkFiles = async (dirPath, _dirs, files, context) => {
132
132
  const outputDir = configMap[configKey].out;
133
133
  const results = {
134
134
  commands: {},
135
- foldersToCreate: [],
135
+ foldersByAlbum: {},
136
136
  metaCache: { ...metaCache },
137
137
  };
138
138
  for (const file of files) {
@@ -185,9 +185,14 @@ const checkFiles = async (dirPath, _dirs, files, context) => {
185
185
  existingFiles = fs.readdirSync(outputFolder);
186
186
  }
187
187
  catch {
188
- results.foldersToCreate.push(outputFolder);
188
+ // output folder will be created by the generated script
189
189
  }
190
190
  if (existingFiles.indexOf(outputPath) < 0) {
191
+ const outputFullPath = path.join(outputFolder, outputPath);
192
+ if (!results.foldersByAlbum[album]) {
193
+ results.foldersByAlbum[album] = new Set();
194
+ }
195
+ results.foldersByAlbum[album].add(path.dirname(outputFullPath));
191
196
  const commands = buildCommand(filepath, output, isCopy, configKey, configMap, appConfig);
192
197
  if (!results.commands[album]) {
193
198
  results.commands[album] = [];
@@ -204,18 +209,28 @@ const mergeResults = (accumulator, current) => {
204
209
  }
205
210
  accumulator.commands[album].push(...current.commands[album]);
206
211
  });
207
- const newFolders = current.foldersToCreate.filter((folder) => !accumulator.foldersToCreate.includes(folder));
208
- accumulator.foldersToCreate.push(...new Set(newFolders));
212
+ for (const album of Object.keys(current.foldersByAlbum)) {
213
+ if (!accumulator.foldersByAlbum[album]) {
214
+ accumulator.foldersByAlbum[album] = new Set();
215
+ }
216
+ for (const folder of current.foldersByAlbum[album]) {
217
+ accumulator.foldersByAlbum[album].add(folder);
218
+ }
219
+ }
209
220
  accumulator.metaCache = { ...accumulator.metaCache, ...current.metaCache };
210
221
  return accumulator;
211
222
  };
212
223
  const sanitizeScriptName = (album) => album.replace(/[^a-zA-Z0-9._-]+/g, "_").replace(/^_+|_+$/g, "") || "album";
213
- const writeCommands = (commands, configKey, appConfig) => {
224
+ const writeCommands = (commands, foldersByAlbum, configKey, appConfig) => {
214
225
  Object.keys(commands).forEach((albums, i) => {
215
226
  console.log(`writing commands for ${albums}`);
216
227
  const filePath = path.join(appConfig.commandsFolder, String(i % appConfig.numOfCores), `${sanitizeScriptName(albums)}-${configKey}-commands.sh`);
217
228
  fs.mkdirSync(path.dirname(filePath), { recursive: true });
218
- fs.writeFileSync(filePath, commands[albums].join("\n"));
229
+ const folders = [...(foldersByAlbum[albums] ?? new Set())].sort();
230
+ const mkdirLines = folders.map((folder) => `mkdir -p ${shellQuote(folder)}`);
231
+ const scriptBody = commands[albums].join("\n");
232
+ const content = mkdirLines.length > 0 ? `${mkdirLines.join("\n")}\n${scriptBody}` : scriptBody;
233
+ fs.writeFileSync(filePath, content);
219
234
  });
220
235
  };
221
236
  const artistFilter = (filter) => (artist) => {
@@ -246,18 +261,11 @@ export const processEncoder = async (configKey, startFolder, filter, appConfig,
246
261
  const results = await walkSync(normalizedStart, (dirPath, dirs, files) => checkFiles(dirPath, dirs, files, context), artistFilter(filter));
247
262
  const finalResults = results.reduce(mergeResults, {
248
263
  commands: {},
249
- foldersToCreate: [],
264
+ foldersByAlbum: {},
250
265
  metaCache: {},
251
266
  });
252
267
  metaGetter.writeBack();
253
- writeCommands(finalResults.commands, configKey, appConfig);
254
- for (const outputFolder of finalResults.foldersToCreate) {
255
- const confirmation = await prompts.confirm(`Create folder: ${outputFolder}`);
256
- if (confirmation) {
257
- console.log(`creating folder: ${outputFolder}`);
258
- fse.ensureDir(outputFolder);
259
- }
260
- }
268
+ writeCommands(finalResults.commands, finalResults.foldersByAlbum, configKey, appConfig);
261
269
  return finalResults;
262
270
  };
263
271
  export const listCommandScripts = (appConfig) => {
@@ -1 +1 @@
1
- {"version":3,"file":"processEncoder.js","sourceRoot":"","sources":["../src/processEncoder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"processEncoder.js","sourceRoot":"","sources":["../src/processEncoder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ export declare const repairMetaYearsFromAlac: (configPath?: string) => Promise<{
3
+ checked: number;
4
+ updated: number;
5
+ missing: number;
6
+ matched: number;
7
+ }>;
8
+ //# sourceMappingURL=repairMetaYears.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repairMetaYears.d.ts","sourceRoot":"","sources":["../src/repairMetaYears.ts"],"names":[],"mappings":";AAkCA,eAAO,MAAM,uBAAuB,GAClC,aAAa,MAAM,KAClB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA8DhF,CAAC"}
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env node
2
+ import fs from "fs";
3
+ import path from "path";
4
+ import { getConfig, loadConfig } from "./config.js";
5
+ import { buildArtistOutputDir, findAlbumFolderOnDisk, } from "./outputPaths.js";
6
+ import { createCliPrompts } from "./prompts.js";
7
+ const normalizeYear = (year) => year?.trim() ?? "";
8
+ const loadMetaCache = (metaFile) => {
9
+ try {
10
+ return JSON.parse(fs.readFileSync(metaFile, "utf-8"));
11
+ }
12
+ catch {
13
+ return {};
14
+ }
15
+ };
16
+ const writeLocalBackup = (sourcePath, meta) => {
17
+ const backupFile = path.join(sourcePath, "meta.json");
18
+ if (!fs.existsSync(sourcePath)) {
19
+ return;
20
+ }
21
+ fs.writeFileSync(backupFile, JSON.stringify(meta));
22
+ };
23
+ export const repairMetaYearsFromAlac = async (configPath) => {
24
+ loadConfig(configPath ? path.resolve(configPath) : undefined);
25
+ const config = getConfig();
26
+ const prompts = createCliPrompts();
27
+ const alacEncoder = config.encoders.find((encoder) => encoder.id === "alac");
28
+ if (!alacEncoder) {
29
+ throw new Error("No alac encoder found in config");
30
+ }
31
+ const metaData = loadMetaCache(config.metaFile);
32
+ const entries = Object.entries(metaData);
33
+ let checked = 0;
34
+ let updated = 0;
35
+ let missing = 0;
36
+ let matched = 0;
37
+ for (const [sourcePath, meta] of entries) {
38
+ checked++;
39
+ const artistDir = buildArtistOutputDir(alacEncoder.out, meta.genre, meta.fullArtist);
40
+ const folderMatch = findAlbumFolderOnDisk(artistDir, meta.fullAlbum);
41
+ if (!folderMatch) {
42
+ missing++;
43
+ continue;
44
+ }
45
+ matched++;
46
+ const metaYear = normalizeYear(meta.year);
47
+ const diskYear = normalizeYear(folderMatch.year);
48
+ if (metaYear === diskYear) {
49
+ continue;
50
+ }
51
+ const accept = await prompts.confirm(`Update ${meta.fullArtist} / ${meta.fullAlbum}\n` +
52
+ ` folder: ${folderMatch.folderName}\n` +
53
+ ` meta year: ${metaYear || "(none)"} -> ${diskYear || "(none)"}?`, true);
54
+ if (!accept) {
55
+ continue;
56
+ }
57
+ meta.year = diskYear;
58
+ metaData[sourcePath] = meta;
59
+ writeLocalBackup(sourcePath, meta);
60
+ updated++;
61
+ }
62
+ if (updated > 0) {
63
+ fs.writeFileSync(config.metaFile, JSON.stringify(metaData, undefined, 2));
64
+ }
65
+ return { checked, updated, missing, matched };
66
+ };
67
+ const configArgIndex = process.argv.indexOf("-c");
68
+ const configPath = configArgIndex >= 0 ? process.argv[configArgIndex + 1] : undefined;
69
+ const result = await repairMetaYearsFromAlac(configPath);
70
+ console.log(`Checked ${result.checked} meta entries.`);
71
+ console.log(` matched on disk: ${result.matched}`);
72
+ console.log(` no album folder: ${result.missing}`);
73
+ console.log(` updated: ${result.updated}`);
74
+ //# sourceMappingURL=repairMetaYears.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repairMetaYears.js","sourceRoot":"","sources":["../src/repairMetaYears.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ interface SyncMetaResult {
3
+ updated: number;
4
+ unchanged: number;
5
+ missingLocal: number;
6
+ added: number;
7
+ total: number;
8
+ }
9
+ export declare const syncMetaFromLocal: (configPath?: string) => SyncMetaResult;
10
+ export {};
11
+ //# sourceMappingURL=syncMetaFromLocal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncMetaFromLocal.d.ts","sourceRoot":"","sources":["../src/syncMetaFromLocal.ts"],"names":[],"mappings":";AAQA,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAuED,eAAO,MAAM,iBAAiB,GAAI,aAAa,MAAM,KAAG,cAkDvD,CAAC"}
@@ -0,0 +1,113 @@
1
+ #!/usr/bin/env node
2
+ import fs from "fs";
3
+ import path from "path";
4
+ import { getConfig, loadConfig } from "./config.js";
5
+ import { normalizeDir } from "./paths.js";
6
+ const shouldSkipDir = (name) => name.startsWith("@") || name === "#recycle";
7
+ const isValidMetadata = (value) => {
8
+ if (!value || typeof value !== "object") {
9
+ return false;
10
+ }
11
+ const meta = value;
12
+ return (typeof meta.fullArtist === "string" &&
13
+ typeof meta.fullAlbum === "string" &&
14
+ typeof meta.genre === "string" &&
15
+ meta.year !== undefined);
16
+ };
17
+ const readLocalMeta = (dirPath) => {
18
+ const backupFile = path.join(dirPath, "meta.json");
19
+ try {
20
+ const parsed = JSON.parse(fs.readFileSync(backupFile, "utf-8"));
21
+ if (isValidMetadata(parsed)) {
22
+ return parsed;
23
+ }
24
+ }
25
+ catch {
26
+ // no local meta.json or invalid contents
27
+ }
28
+ return null;
29
+ };
30
+ const walkLocalMeta = (start, found = new Map()) => {
31
+ const dirPath = normalizeDir(start);
32
+ let entries;
33
+ try {
34
+ entries = fs.readdirSync(dirPath, { withFileTypes: true });
35
+ }
36
+ catch {
37
+ return found;
38
+ }
39
+ const localMeta = readLocalMeta(dirPath);
40
+ if (localMeta) {
41
+ found.set(dirPath, localMeta);
42
+ }
43
+ for (const entry of entries) {
44
+ if (!entry.isDirectory() || shouldSkipDir(entry.name)) {
45
+ continue;
46
+ }
47
+ walkLocalMeta(path.join(dirPath, entry.name), found);
48
+ }
49
+ return found;
50
+ };
51
+ const loadCentralMeta = (metaFile) => {
52
+ try {
53
+ const parsed = JSON.parse(fs.readFileSync(metaFile, "utf-8"));
54
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
55
+ return {};
56
+ }
57
+ return parsed;
58
+ }
59
+ catch {
60
+ return {};
61
+ }
62
+ };
63
+ export const syncMetaFromLocal = (configPath) => {
64
+ loadConfig(configPath ? path.resolve(configPath) : undefined);
65
+ const config = getConfig();
66
+ const central = loadCentralMeta(config.metaFile);
67
+ const localByPath = new Map();
68
+ for (const folder of config.startFolders) {
69
+ walkLocalMeta(folder.path, localByPath);
70
+ }
71
+ let updated = 0;
72
+ let unchanged = 0;
73
+ let missingLocal = 0;
74
+ for (const dirPath of Object.keys(central)) {
75
+ const localMeta = readLocalMeta(dirPath) ?? localByPath.get(normalizeDir(dirPath));
76
+ if (!localMeta) {
77
+ missingLocal++;
78
+ continue;
79
+ }
80
+ if (JSON.stringify(central[dirPath]) === JSON.stringify(localMeta)) {
81
+ unchanged++;
82
+ continue;
83
+ }
84
+ central[dirPath] = localMeta;
85
+ updated++;
86
+ }
87
+ let added = 0;
88
+ for (const [dirPath, localMeta] of localByPath) {
89
+ if (central[dirPath]) {
90
+ continue;
91
+ }
92
+ central[dirPath] = localMeta;
93
+ added++;
94
+ }
95
+ fs.writeFileSync(config.metaFile, JSON.stringify(central, undefined, 2));
96
+ return {
97
+ updated,
98
+ unchanged,
99
+ missingLocal,
100
+ added,
101
+ total: Object.keys(central).length,
102
+ };
103
+ };
104
+ const configArgIndex = process.argv.indexOf("-c");
105
+ const configPath = configArgIndex >= 0 ? process.argv[configArgIndex + 1] : undefined;
106
+ const result = syncMetaFromLocal(configPath);
107
+ console.log(`Synced ${getConfig().metaFile} from local album meta.json files.`);
108
+ console.log(` updated: ${result.updated}`);
109
+ console.log(` unchanged: ${result.unchanged}`);
110
+ console.log(` no local meta: ${result.missingLocal}`);
111
+ console.log(` added: ${result.added}`);
112
+ console.log(` total entries: ${result.total}`);
113
+ //# sourceMappingURL=syncMetaFromLocal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncMetaFromLocal.js","sourceRoot":"","sources":["../src/syncMetaFromLocal.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@emgeebee/music_downcoder",
3
- "version": "1.1.7",
3
+ "version": "1.1.9",
4
4
  "description": "Scan music libraries and generate ffmpeg conversion scripts with a CLI or web UI",
5
5
  "type": "module",
6
6
  "bin": {
@@ -18,6 +18,9 @@
18
18
  "serve": "tsx src/index.ts serve -c docker/conf.local.json -H 127.0.0.1 -p 3798",
19
19
  "list": "find ./cmd/**/*.sh -type f 2>/dev/null | sort -nr",
20
20
  "convert": "./batch.sh",
21
+ "clean-empty": "tsx src/cleanEmptyFolders.ts -c docker/conf.local.json",
22
+ "sync-meta": "tsx src/syncMetaFromLocal.ts -c docker/conf.local.json",
23
+ "repair-meta-years": "tsx src/repairMetaYears.ts -c docker/conf.local.json",
21
24
  "type-check": "tsc --noEmit"
22
25
  },
23
26
  "dependencies": {