mpv-mcp-server 1.1.0 → 1.2.0
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/README.md +5 -5
- package/dist/tools/metadata.js +88 -73
- package/dist/tools/metadata.js.map +1 -1
- package/dist/tools/navigation.js +1 -3
- package/dist/tools/navigation.js.map +1 -1
- package/dist/tools/play.js +1 -3
- package/dist/tools/play.js.map +1 -1
- package/dist/tools/playlist.js +1 -3
- package/dist/tools/playlist.js.map +1 -1
- package/dist/tools/youtube.js +37 -37
- package/dist/tools/youtube.js.map +1 -1
- package/dist/utils/exec.d.ts +4 -0
- package/dist/utils/exec.js +19 -0
- package/dist/utils/exec.js.map +1 -0
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ MCP server for controlling [mpv](https://mpv.io) media player. Browse your music
|
|
|
7
7
|
- **[mpv](https://mpv.io/installation/)** — media player (must be on your PATH, or set `MPV_PATH`)
|
|
8
8
|
- **[Node.js](https://nodejs.org/) 22+**
|
|
9
9
|
- **[yt-dlp](https://github.com/yt-dlp/yt-dlp)** *(optional)* — required for YouTube streaming and downloading
|
|
10
|
-
- **[ffmpeg](https://ffmpeg.org/)** *(optional)* — required for audio extraction
|
|
10
|
+
- **[ffmpeg](https://ffmpeg.org/)** *(optional)* — required for audio extraction, metadata reading (ffprobe), and tagging
|
|
11
11
|
|
|
12
12
|
## Quick Start
|
|
13
13
|
|
|
@@ -105,7 +105,7 @@ All configuration is via environment variables. Everything has sensible defaults
|
|
|
105
105
|
|
|
106
106
|
| Tool | Description |
|
|
107
107
|
|---|---|
|
|
108
|
-
| `mpv_youtube` | Search YouTube and stream through mpv |
|
|
108
|
+
| `mpv_youtube` | Search YouTube and stream through mpv (supports append mode) |
|
|
109
109
|
| `mpv_download` | Download from YouTube (audio or video) |
|
|
110
110
|
|
|
111
111
|
YouTube tools require [yt-dlp](https://github.com/yt-dlp/yt-dlp) on your PATH. Audio downloads also require [ffmpeg](https://ffmpeg.org/).
|
|
@@ -114,10 +114,10 @@ YouTube tools require [yt-dlp](https://github.com/yt-dlp/yt-dlp) on your PATH. A
|
|
|
114
114
|
|
|
115
115
|
| Tool | Description |
|
|
116
116
|
|---|---|
|
|
117
|
-
| `mpv_info` | Get metadata
|
|
118
|
-
| `mpv_tag` | Write metadata tags to a file
|
|
117
|
+
| `mpv_info` | Get metadata for the current track or any file by search term |
|
|
118
|
+
| `mpv_tag` | Write metadata tags (artist, title, album, genre, date, comment) to a file |
|
|
119
119
|
|
|
120
|
-
|
|
120
|
+
Both tools infer artist/title from the "Artist - Title" filename pattern. Requires [ffmpeg](https://ffmpeg.org/) (includes ffprobe).
|
|
121
121
|
|
|
122
122
|
## How It Works
|
|
123
123
|
|
package/dist/tools/metadata.js
CHANGED
|
@@ -1,37 +1,65 @@
|
|
|
1
|
-
import { execFile } from "node:child_process";
|
|
2
1
|
import { existsSync } from "node:fs";
|
|
2
|
+
import { rename } from "node:fs/promises";
|
|
3
3
|
import { basename, extname, normalize } from "node:path";
|
|
4
4
|
import { z } from "zod";
|
|
5
|
+
import { runCommand } from "../utils/exec.js";
|
|
6
|
+
/** Writable tag fields — single source of truth for mpv_info display order and mpv_tag writes */
|
|
7
|
+
const TAG_FIELDS = ["artist", "title", "album", "genre", "date", "comment"];
|
|
8
|
+
/** Display order for mpv_info — includes read-only fields like "track" */
|
|
9
|
+
const DISPLAY_ORDER = [...TAG_FIELDS, "track"];
|
|
5
10
|
export function registerMetadataTools(server, ipc, scanner) {
|
|
6
11
|
server.registerTool("mpv_info", {
|
|
7
12
|
title: "Track Info",
|
|
8
|
-
description: "Get metadata (artist, title, album, genre, etc.) for the currently playing track.",
|
|
9
|
-
inputSchema: {
|
|
13
|
+
description: "Get metadata (artist, title, album, genre, etc.) for a file by search term, or the currently playing track if omitted.",
|
|
14
|
+
inputSchema: {
|
|
15
|
+
query: z
|
|
16
|
+
.string()
|
|
17
|
+
.optional()
|
|
18
|
+
.describe("File path or search term. Omit to show info for the currently playing track."),
|
|
19
|
+
},
|
|
10
20
|
annotations: {
|
|
11
21
|
readOnlyHint: true,
|
|
12
22
|
destructiveHint: false,
|
|
13
23
|
idempotentHint: true,
|
|
14
24
|
openWorldHint: false,
|
|
15
25
|
},
|
|
16
|
-
}, async () => {
|
|
26
|
+
}, async ({ query }) => {
|
|
17
27
|
try {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
28
|
+
let metadata = null;
|
|
29
|
+
let displayName = null;
|
|
30
|
+
if (query) {
|
|
31
|
+
const results = await scanner.search(query, 1);
|
|
32
|
+
if (results.length === 0) {
|
|
33
|
+
return {
|
|
34
|
+
content: [{ type: "text", text: `No files matching "${query}" found.` }],
|
|
35
|
+
isError: true,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const filePath = results[0].path;
|
|
39
|
+
displayName = basename(filePath);
|
|
40
|
+
metadata = await readTagsWithFfprobe(filePath);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const idle = await ipc.getProperty("idle-active");
|
|
44
|
+
if (idle) {
|
|
45
|
+
return { content: [{ type: "text", text: "Nothing is playing. Specify a file with the query parameter." }] };
|
|
46
|
+
}
|
|
47
|
+
const [meta, fname] = await Promise.all([
|
|
48
|
+
ipc.getProperty("metadata").catch(() => null),
|
|
49
|
+
ipc.getProperty("filename").catch(() => null),
|
|
50
|
+
]);
|
|
51
|
+
metadata = meta;
|
|
52
|
+
displayName = fname;
|
|
21
53
|
}
|
|
22
|
-
const metadata = (await ipc.getProperty("metadata").catch(() => null));
|
|
23
|
-
const filename = (await ipc.getProperty("filename").catch(() => null));
|
|
24
|
-
const path = (await ipc.getProperty("path").catch(() => null));
|
|
25
54
|
const lines = [];
|
|
26
|
-
if (
|
|
27
|
-
lines.push(`File: ${
|
|
55
|
+
if (displayName) {
|
|
56
|
+
lines.push(`File: ${displayName}`);
|
|
28
57
|
}
|
|
29
58
|
if (metadata && Object.keys(metadata).length > 0) {
|
|
30
59
|
lines.push("");
|
|
31
60
|
lines.push("Metadata:");
|
|
32
|
-
const keyOrder = ["artist", "title", "album", "genre", "date", "track", "comment"];
|
|
33
61
|
const seen = new Set();
|
|
34
|
-
for (const key of
|
|
62
|
+
for (const key of DISPLAY_ORDER) {
|
|
35
63
|
const val = findKey(metadata, key);
|
|
36
64
|
if (val) {
|
|
37
65
|
lines.push(` ${capitalize(key)}: ${val}`);
|
|
@@ -47,8 +75,8 @@ export function registerMetadataTools(server, ipc, scanner) {
|
|
|
47
75
|
else {
|
|
48
76
|
lines.push("");
|
|
49
77
|
lines.push("No embedded metadata found.");
|
|
50
|
-
if (
|
|
51
|
-
const parsed = parseFilename(
|
|
78
|
+
if (displayName) {
|
|
79
|
+
const parsed = parseFilename(displayName);
|
|
52
80
|
if (parsed) {
|
|
53
81
|
lines.push("");
|
|
54
82
|
lines.push("Inferred from filename:");
|
|
@@ -63,24 +91,24 @@ export function registerMetadataTools(server, ipc, scanner) {
|
|
|
63
91
|
}
|
|
64
92
|
catch {
|
|
65
93
|
return {
|
|
66
|
-
content: [{ type: "text", text: "
|
|
94
|
+
content: [{ type: "text", text: "Failed to read metadata." }],
|
|
67
95
|
isError: true,
|
|
68
96
|
};
|
|
69
97
|
}
|
|
70
98
|
});
|
|
71
99
|
server.registerTool("mpv_tag", {
|
|
72
100
|
title: "Tag File",
|
|
73
|
-
description: "Write metadata tags to a media file using ffmpeg. Can target
|
|
101
|
+
description: "Write metadata tags to a media file using ffmpeg. Can target a file by search term. Infers artist/title from the filename if not provided.",
|
|
74
102
|
inputSchema: {
|
|
75
103
|
query: z
|
|
76
104
|
.string()
|
|
77
|
-
.
|
|
78
|
-
.describe("File path or search term. Omit to tag the currently playing file."),
|
|
105
|
+
.describe("File path or search term for the file to tag"),
|
|
79
106
|
artist: z.string().optional().describe("Artist name"),
|
|
80
107
|
title: z.string().optional().describe("Track title"),
|
|
81
108
|
album: z.string().optional().describe("Album name"),
|
|
82
109
|
genre: z.string().optional().describe("Genre (e.g. Rock, Jazz, Metal)"),
|
|
83
110
|
date: z.string().optional().describe("Year or date (e.g. 1978)"),
|
|
111
|
+
comment: z.string().optional().describe("Comment (e.g. rating, notes, mood)"),
|
|
84
112
|
},
|
|
85
113
|
annotations: {
|
|
86
114
|
readOnlyHint: false,
|
|
@@ -88,7 +116,7 @@ export function registerMetadataTools(server, ipc, scanner) {
|
|
|
88
116
|
idempotentHint: true,
|
|
89
117
|
openWorldHint: false,
|
|
90
118
|
},
|
|
91
|
-
}, async ({ query, artist, title, album, genre, date }) => {
|
|
119
|
+
}, async ({ query, artist, title, album, genre, date, comment }) => {
|
|
92
120
|
try {
|
|
93
121
|
let filePath = null;
|
|
94
122
|
if (query) {
|
|
@@ -102,7 +130,7 @@ export function registerMetadataTools(server, ipc, scanner) {
|
|
|
102
130
|
filePath = results[0].path;
|
|
103
131
|
}
|
|
104
132
|
else {
|
|
105
|
-
//
|
|
133
|
+
// No query — target currently playing file, but can't tag it while locked
|
|
106
134
|
filePath = (await ipc.getProperty("path").catch(() => null));
|
|
107
135
|
if (!filePath) {
|
|
108
136
|
return {
|
|
@@ -110,6 +138,15 @@ export function registerMetadataTools(server, ipc, scanner) {
|
|
|
110
138
|
isError: true,
|
|
111
139
|
};
|
|
112
140
|
}
|
|
141
|
+
return {
|
|
142
|
+
content: [
|
|
143
|
+
{
|
|
144
|
+
type: "text",
|
|
145
|
+
text: `Cannot tag "${basename(filePath)}" — it is currently playing. Skip to another track first, or specify the file by name.`,
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
isError: true,
|
|
149
|
+
};
|
|
113
150
|
}
|
|
114
151
|
if (!existsSync(filePath)) {
|
|
115
152
|
return {
|
|
@@ -132,33 +169,26 @@ export function registerMetadataTools(server, ipc, scanner) {
|
|
|
132
169
|
}
|
|
133
170
|
// Infer artist/title from filename if not provided
|
|
134
171
|
const parsed = parseFilename(basename(filePath));
|
|
135
|
-
const
|
|
136
|
-
|
|
172
|
+
const tagValues = {
|
|
173
|
+
artist: artist ?? parsed?.artist,
|
|
174
|
+
title: title ?? parsed?.title,
|
|
175
|
+
album,
|
|
176
|
+
genre,
|
|
177
|
+
date,
|
|
178
|
+
comment,
|
|
179
|
+
};
|
|
137
180
|
const args = ["-i", filePath, "-c", "copy"];
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
tagCount++;
|
|
146
|
-
}
|
|
147
|
-
if (album) {
|
|
148
|
-
args.push("-metadata", `album=${album}`);
|
|
149
|
-
tagCount++;
|
|
150
|
-
}
|
|
151
|
-
if (genre) {
|
|
152
|
-
args.push("-metadata", `genre=${genre}`);
|
|
153
|
-
tagCount++;
|
|
154
|
-
}
|
|
155
|
-
if (date) {
|
|
156
|
-
args.push("-metadata", `date=${date}`);
|
|
157
|
-
tagCount++;
|
|
181
|
+
const tags = [];
|
|
182
|
+
for (const field of TAG_FIELDS) {
|
|
183
|
+
const val = tagValues[field];
|
|
184
|
+
if (val) {
|
|
185
|
+
args.push("-metadata", `${field}=${val}`);
|
|
186
|
+
tags.push(`${capitalize(field)}: ${val}`);
|
|
187
|
+
}
|
|
158
188
|
}
|
|
159
|
-
if (
|
|
189
|
+
if (tags.length === 0) {
|
|
160
190
|
return {
|
|
161
|
-
content: [{ type: "text", text:
|
|
191
|
+
content: [{ type: "text", text: `No tags to write. Provide at least one of: ${TAG_FIELDS.join(", ")}.` }],
|
|
162
192
|
isError: true,
|
|
163
193
|
};
|
|
164
194
|
}
|
|
@@ -166,27 +196,13 @@ export function registerMetadataTools(server, ipc, scanner) {
|
|
|
166
196
|
const ext = extname(filePath);
|
|
167
197
|
const tmpPath = filePath.replace(ext, `.tmp${ext}`);
|
|
168
198
|
args.push("-y", tmpPath);
|
|
169
|
-
await
|
|
170
|
-
// Replace original with tagged version
|
|
171
|
-
const { rename } = await import("node:fs/promises");
|
|
199
|
+
await runCommand("ffmpeg", args);
|
|
172
200
|
await rename(tmpPath, filePath);
|
|
173
|
-
const tags = [];
|
|
174
|
-
if (finalArtist)
|
|
175
|
-
tags.push(`Artist: ${finalArtist}`);
|
|
176
|
-
if (finalTitle)
|
|
177
|
-
tags.push(`Title: ${finalTitle}`);
|
|
178
|
-
if (album)
|
|
179
|
-
tags.push(`Album: ${album}`);
|
|
180
|
-
if (genre)
|
|
181
|
-
tags.push(`Genre: ${genre}`);
|
|
182
|
-
if (date)
|
|
183
|
-
tags.push(`Date: ${date}`);
|
|
184
|
-
const name = basename(filePath);
|
|
185
201
|
return {
|
|
186
202
|
content: [
|
|
187
203
|
{
|
|
188
204
|
type: "text",
|
|
189
|
-
text: `Tagged ${
|
|
205
|
+
text: `Tagged ${basename(filePath)}:\n${tags.map((t) => ` ${t}`).join("\n")}`,
|
|
190
206
|
},
|
|
191
207
|
],
|
|
192
208
|
};
|
|
@@ -226,16 +242,15 @@ function findKey(obj, key) {
|
|
|
226
242
|
function capitalize(s) {
|
|
227
243
|
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
228
244
|
}
|
|
229
|
-
function
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
});
|
|
245
|
+
async function readTagsWithFfprobe(filePath) {
|
|
246
|
+
try {
|
|
247
|
+
const stdout = await runCommand("ffprobe", ["-v", "quiet", "-print_format", "json", "-show_format", filePath], 10_000);
|
|
248
|
+
const data = JSON.parse(stdout);
|
|
249
|
+
const tags = data?.format?.tags;
|
|
250
|
+
return tags && typeof tags === "object" ? tags : null;
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
240
255
|
}
|
|
241
256
|
//# sourceMappingURL=metadata.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/tools/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/tools/metadata.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/navigation.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { delay } from "../utils/exec.js";
|
|
1
2
|
export function registerNavigationTools(server, ipc) {
|
|
2
3
|
server.registerTool("mpv_next", {
|
|
3
4
|
title: "Next Track",
|
|
@@ -56,7 +57,4 @@ export function registerNavigationTools(server, ipc) {
|
|
|
56
57
|
}
|
|
57
58
|
});
|
|
58
59
|
}
|
|
59
|
-
function delay(ms) {
|
|
60
|
-
return new Promise((r) => setTimeout(r, ms));
|
|
61
|
-
}
|
|
62
60
|
//# sourceMappingURL=navigation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../src/tools/navigation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../src/tools/navigation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,GAAW;IACpE,MAAM,CAAC,YAAY,CACjB,UAAU,EACV;QACE,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,yCAAyC;QACtD,WAAW,EAAE,EAAE;QACf,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;YACrC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC1E,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,gBAAgB,KAAK,EAAE,EAAE,CAAC;aACpE,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,qCAAqC,EAAE;iBACvE;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,UAAU,EACV;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,gDAAgD;QAC7D,WAAW,EAAE,EAAE;QACf,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;YACrC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC1E,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,gBAAgB,KAAK,EAAE,EAAE,CAAC;aACpE,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,2CAA2C,EAAE;iBAC7E;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/dist/tools/play.js
CHANGED
|
@@ -2,6 +2,7 @@ import { existsSync } from "node:fs";
|
|
|
2
2
|
import { isAbsolute } from "node:path";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { toMpvPath } from "../utils/path.js";
|
|
5
|
+
import { delay } from "../utils/exec.js";
|
|
5
6
|
export function registerPlayTool(server, ipc, scanner) {
|
|
6
7
|
server.registerTool("mpv_play", {
|
|
7
8
|
title: "Play Music/Video",
|
|
@@ -76,7 +77,4 @@ export function registerPlayTool(server, ipc, scanner) {
|
|
|
76
77
|
}
|
|
77
78
|
});
|
|
78
79
|
}
|
|
79
|
-
function delay(ms) {
|
|
80
|
-
return new Promise((r) => setTimeout(r, ms));
|
|
81
|
-
}
|
|
82
80
|
//# sourceMappingURL=play.js.map
|
package/dist/tools/play.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"play.js","sourceRoot":"","sources":["../../src/tools/play.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"play.js","sourceRoot":"","sources":["../../src/tools/play.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/playlist.js
CHANGED
|
@@ -2,6 +2,7 @@ import { existsSync } from "node:fs";
|
|
|
2
2
|
import { isAbsolute } from "node:path";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { toMpvPath } from "../utils/path.js";
|
|
5
|
+
import { delay } from "../utils/exec.js";
|
|
5
6
|
export function registerPlaylistTools(server, ipc, scanner) {
|
|
6
7
|
server.registerTool("mpv_playlist", {
|
|
7
8
|
title: "Show Playlist",
|
|
@@ -168,7 +169,4 @@ export function registerPlaylistTools(server, ipc, scanner) {
|
|
|
168
169
|
}
|
|
169
170
|
});
|
|
170
171
|
}
|
|
171
|
-
function delay(ms) {
|
|
172
|
-
return new Promise((r) => setTimeout(r, ms));
|
|
173
|
-
}
|
|
174
172
|
//# sourceMappingURL=playlist.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playlist.js","sourceRoot":"","sources":["../../src/tools/playlist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"playlist.js","sourceRoot":"","sources":["../../src/tools/playlist.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/youtube.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import { execFile } from "node:child_process";
|
|
2
1
|
import { join } from "node:path";
|
|
3
|
-
import {
|
|
2
|
+
import { mkdirSync } from "node:fs";
|
|
4
3
|
import { z } from "zod";
|
|
5
4
|
import { DOWNLOAD_DIR } from "../config.js";
|
|
5
|
+
import { runCommand, delay } from "../utils/exec.js";
|
|
6
|
+
function isYouTubeUrl(query) {
|
|
7
|
+
return query.includes("youtube.com/") || query.includes("youtu.be/");
|
|
8
|
+
}
|
|
6
9
|
export function registerYoutubeTools(server, ipc, scanner) {
|
|
7
10
|
server.registerTool("mpv_youtube", {
|
|
8
11
|
title: "Play from YouTube",
|
|
@@ -20,6 +23,11 @@ export function registerYoutubeTools(server, ipc, scanner) {
|
|
|
20
23
|
.default(1)
|
|
21
24
|
.optional()
|
|
22
25
|
.describe("Number of search results to queue (default 1, max 10)"),
|
|
26
|
+
mode: z
|
|
27
|
+
.enum(["replace", "append"])
|
|
28
|
+
.default("replace")
|
|
29
|
+
.optional()
|
|
30
|
+
.describe('"replace" clears playlist (default), "append" adds to current playlist'),
|
|
23
31
|
},
|
|
24
32
|
annotations: {
|
|
25
33
|
readOnlyHint: false,
|
|
@@ -27,19 +35,29 @@ export function registerYoutubeTools(server, ipc, scanner) {
|
|
|
27
35
|
idempotentHint: false,
|
|
28
36
|
openWorldHint: true,
|
|
29
37
|
},
|
|
30
|
-
}, async ({ query, results }) => {
|
|
38
|
+
}, async ({ query, results, mode }) => {
|
|
31
39
|
try {
|
|
32
40
|
const count = results ?? 1;
|
|
33
|
-
const
|
|
34
|
-
const target =
|
|
35
|
-
await ipc.command(["loadfile", target, "replace"]);
|
|
36
|
-
|
|
41
|
+
const loadMode = mode ?? "replace";
|
|
42
|
+
const target = isYouTubeUrl(query) ? query : `ytdl://ytsearch${count}:${query}`;
|
|
43
|
+
await ipc.command(["loadfile", target, loadMode === "append" ? "append" : "replace"]);
|
|
44
|
+
if (loadMode === "append") {
|
|
45
|
+
return {
|
|
46
|
+
content: [
|
|
47
|
+
{
|
|
48
|
+
type: "text",
|
|
49
|
+
text: `Queued from YouTube: "${query}"${count > 1 ? ` (top ${count} results)` : ""}`,
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
await delay(2000);
|
|
37
55
|
const title = await ipc
|
|
38
56
|
.getProperty("media-title")
|
|
39
57
|
.catch(() => null);
|
|
40
58
|
if (title) {
|
|
41
59
|
const lines = [`Streaming from YouTube: ${title}`];
|
|
42
|
-
if (!
|
|
60
|
+
if (!isYouTubeUrl(query) && count > 1) {
|
|
43
61
|
lines.push(`(queued top ${count} results)`);
|
|
44
62
|
}
|
|
45
63
|
return { content: [{ type: "text", text: lines.join("\n") }] };
|
|
@@ -48,7 +66,7 @@ export function registerYoutubeTools(server, ipc, scanner) {
|
|
|
48
66
|
content: [
|
|
49
67
|
{
|
|
50
68
|
type: "text",
|
|
51
|
-
text:
|
|
69
|
+
text: isYouTubeUrl(query)
|
|
52
70
|
? "Loading YouTube URL... (may take a moment to buffer)"
|
|
53
71
|
: `Searching YouTube for "${query}"... (playback will start shortly)`,
|
|
54
72
|
},
|
|
@@ -87,27 +105,24 @@ export function registerYoutubeTools(server, ipc, scanner) {
|
|
|
87
105
|
},
|
|
88
106
|
}, async ({ query, format }) => {
|
|
89
107
|
try {
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
const target = isUrl ? query : `ytsearch:${query}`;
|
|
93
|
-
if (!existsSync(DOWNLOAD_DIR)) {
|
|
94
|
-
mkdirSync(DOWNLOAD_DIR, { recursive: true });
|
|
95
|
-
}
|
|
108
|
+
const target = isYouTubeUrl(query) ? query : `ytsearch:${query}`;
|
|
109
|
+
mkdirSync(DOWNLOAD_DIR, { recursive: true });
|
|
96
110
|
const args = [];
|
|
97
|
-
if (
|
|
111
|
+
if (format === "audio") {
|
|
98
112
|
args.push("-x", "--audio-format", "mp3", "--audio-quality", "0", "-o", join(DOWNLOAD_DIR, "%(artist,uploader)s - %(title)s.%(ext)s"));
|
|
99
113
|
}
|
|
100
114
|
else {
|
|
101
115
|
args.push("-f", "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best", "-o", join(DOWNLOAD_DIR, "%(artist,uploader)s - %(title)s.%(ext)s"));
|
|
102
116
|
}
|
|
103
117
|
args.push("--no-playlist", "--restrict-filenames", target);
|
|
104
|
-
//
|
|
105
|
-
const info = await
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
118
|
+
// Fetch title and download in parallel — title failure shouldn't kill the download
|
|
119
|
+
const [info] = await Promise.all([
|
|
120
|
+
runCommand("yt-dlp", ["--print", "title", "--no-playlist", target], 120_000).catch(() => query),
|
|
121
|
+
runCommand("yt-dlp", args, 120_000),
|
|
122
|
+
]);
|
|
123
|
+
const title = (typeof info === "string" ? info.trim() : query) || query;
|
|
109
124
|
scanner.invalidateCache();
|
|
110
|
-
const typeLabel =
|
|
125
|
+
const typeLabel = format === "audio" ? "audio (MP3)" : "video";
|
|
111
126
|
return {
|
|
112
127
|
content: [
|
|
113
128
|
{
|
|
@@ -130,19 +145,4 @@ export function registerYoutubeTools(server, ipc, scanner) {
|
|
|
130
145
|
}
|
|
131
146
|
});
|
|
132
147
|
}
|
|
133
|
-
function delay(ms) {
|
|
134
|
-
return new Promise((r) => setTimeout(r, ms));
|
|
135
|
-
}
|
|
136
|
-
function runYtDlp(args) {
|
|
137
|
-
return new Promise((resolve, reject) => {
|
|
138
|
-
execFile("yt-dlp", args, { timeout: 120_000 }, (err, stdout, stderr) => {
|
|
139
|
-
if (err) {
|
|
140
|
-
reject(new Error(stderr || err.message));
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
143
|
-
resolve(stdout);
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
148
|
//# sourceMappingURL=youtube.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"youtube.js","sourceRoot":"","sources":["../../src/tools/youtube.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"youtube.js","sourceRoot":"","sources":["../../src/tools/youtube.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
/** Run an external command and return stdout. Rejects with stderr on failure. */
|
|
3
|
+
export function runCommand(binary, args, timeout = 30_000) {
|
|
4
|
+
return new Promise((resolve, reject) => {
|
|
5
|
+
execFile(binary, args, { timeout }, (err, stdout, stderr) => {
|
|
6
|
+
if (err) {
|
|
7
|
+
reject(new Error(stderr || err.message));
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
resolve(stdout);
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
/** Small async delay */
|
|
16
|
+
export function delay(ms) {
|
|
17
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,iFAAiF;AACjF,MAAM,UAAU,UAAU,CACxB,MAAc,EACd,IAAc,EACd,OAAO,GAAG,MAAM;IAEhB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YAC1D,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,wBAAwB;AACxB,MAAM,UAAU,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mpv-mcp-server",
|
|
3
|
-
"
|
|
3
|
+
"mcpName": "io.github.arijit-gogoi/mpv-mcp-server",
|
|
4
|
+
"version": "1.2.0",
|
|
4
5
|
"description": "MCP server for controlling mpv media player — playback, playlists, YouTube streaming and downloading",
|
|
5
6
|
"type": "module",
|
|
6
7
|
"main": "dist/index.js",
|