@thelord/mcp-arr 1.0.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.
@@ -0,0 +1,121 @@
1
+ /**
2
+ * TRaSH Guides Client
3
+ *
4
+ * Fetches and caches quality profiles, custom formats, and naming conventions
5
+ * from the TRaSH Guides GitHub repository.
6
+ *
7
+ * Data source: https://github.com/TRaSH-Guides/Guides
8
+ */
9
+ export type TrashService = 'radarr' | 'sonarr';
10
+ export interface TrashCustomFormat {
11
+ trash_id: string;
12
+ trash_scores?: {
13
+ default: number;
14
+ };
15
+ name: string;
16
+ includeCustomFormatWhenRenaming: boolean;
17
+ specifications: Array<{
18
+ name: string;
19
+ implementation: string;
20
+ negate: boolean;
21
+ required: boolean;
22
+ fields: Record<string, unknown>;
23
+ }>;
24
+ }
25
+ export interface TrashQualityProfile {
26
+ trash_id: string;
27
+ name: string;
28
+ trash_description?: string;
29
+ group?: number;
30
+ upgradeAllowed: boolean;
31
+ cutoff: string;
32
+ minFormatScore: number;
33
+ cutoffFormatScore: number;
34
+ minUpgradeFormatScore: number;
35
+ language: string;
36
+ items: Array<{
37
+ name: string;
38
+ allowed: boolean;
39
+ items?: string[];
40
+ }>;
41
+ formatItems: Record<string, string>;
42
+ }
43
+ export interface TrashQualitySize {
44
+ trash_id: string;
45
+ type: string;
46
+ qualities: Array<{
47
+ quality: string;
48
+ min: number;
49
+ preferred: number;
50
+ max: number;
51
+ }>;
52
+ }
53
+ export interface TrashNaming {
54
+ folder: Record<string, string>;
55
+ file: Record<string, string>;
56
+ season?: Record<string, string>;
57
+ series?: Record<string, string>;
58
+ specials?: Record<string, string>;
59
+ }
60
+ export interface TrashCFGroup {
61
+ name: string;
62
+ trash_id: string;
63
+ trash_description?: string;
64
+ default?: string;
65
+ custom_formats: Array<{
66
+ name: string;
67
+ trash_id: string;
68
+ required?: boolean;
69
+ }>;
70
+ quality_profiles?: {
71
+ exclude?: Record<string, string>;
72
+ include?: Record<string, string>;
73
+ };
74
+ }
75
+ export declare class TrashClient {
76
+ /**
77
+ * List available quality profiles
78
+ */
79
+ listProfiles(service: TrashService): Promise<{
80
+ name: string;
81
+ description?: string;
82
+ }[]>;
83
+ /**
84
+ * Get a specific quality profile
85
+ */
86
+ getProfile(service: TrashService, profileName: string): Promise<TrashQualityProfile | null>;
87
+ /**
88
+ * List available custom formats
89
+ */
90
+ listCustomFormats(service: TrashService, category?: string): Promise<{
91
+ name: string;
92
+ categories: string[];
93
+ defaultScore?: number;
94
+ }[]>;
95
+ /**
96
+ * Get a specific custom format
97
+ */
98
+ getCustomFormat(service: TrashService, cfName: string): Promise<TrashCustomFormat | null>;
99
+ /**
100
+ * Get naming conventions
101
+ */
102
+ getNaming(service: TrashService): Promise<TrashNaming | null>;
103
+ /**
104
+ * Get quality size recommendations
105
+ */
106
+ getQualitySizes(service: TrashService, type?: string): Promise<TrashQualitySize[]>;
107
+ /**
108
+ * Get custom format groups
109
+ */
110
+ listCFGroups(service: TrashService): Promise<string[]>;
111
+ /**
112
+ * Get a specific CF group
113
+ */
114
+ getCFGroup(service: TrashService, groupName: string): Promise<TrashCFGroup | null>;
115
+ /**
116
+ * Clear the cache (force refresh)
117
+ */
118
+ clearCache(): void;
119
+ }
120
+ export declare const trashClient: TrashClient;
121
+ //# sourceMappingURL=trash-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trash-client.d.ts","sourceRoot":"","sources":["../src/trash-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,287 @@
1
+ /**
2
+ * TRaSH Guides Client
3
+ *
4
+ * Fetches and caches quality profiles, custom formats, and naming conventions
5
+ * from the TRaSH Guides GitHub repository.
6
+ *
7
+ * Data source: https://github.com/TRaSH-Guides/Guides
8
+ */
9
+ const TRASH_BASE_URL = 'https://raw.githubusercontent.com/TRaSH-Guides/Guides/master/docs/json';
10
+ const GITHUB_API_URL = 'https://api.github.com/repos/TRaSH-Guides/Guides/contents/docs/json';
11
+ const CACHE_TTL = 60 * 60 * 1000; // 1 hour
12
+ class TrashCache {
13
+ profiles = new Map();
14
+ profileLists = new Map();
15
+ customFormats = new Map();
16
+ cfLists = new Map();
17
+ cfGroups = new Map();
18
+ qualitySizes = new Map();
19
+ naming = new Map();
20
+ isValid(entry) {
21
+ return entry !== undefined && (Date.now() - entry.timestamp) < CACHE_TTL;
22
+ }
23
+ setProfile(key, data) {
24
+ this.profiles.set(key, { data, timestamp: Date.now() });
25
+ }
26
+ getProfile(key) {
27
+ const entry = this.profiles.get(key);
28
+ return this.isValid(entry) ? entry.data : null;
29
+ }
30
+ setProfileList(service, data) {
31
+ this.profileLists.set(service, { data, timestamp: Date.now() });
32
+ }
33
+ getProfileList(service) {
34
+ const entry = this.profileLists.get(service);
35
+ return this.isValid(entry) ? entry.data : null;
36
+ }
37
+ setCustomFormat(key, data) {
38
+ this.customFormats.set(key, { data, timestamp: Date.now() });
39
+ }
40
+ getCustomFormat(key) {
41
+ const entry = this.customFormats.get(key);
42
+ return this.isValid(entry) ? entry.data : null;
43
+ }
44
+ setCFList(service, data) {
45
+ this.cfLists.set(service, { data, timestamp: Date.now() });
46
+ }
47
+ getCFList(service) {
48
+ const entry = this.cfLists.get(service);
49
+ return this.isValid(entry) ? entry.data : null;
50
+ }
51
+ setCFGroup(key, data) {
52
+ this.cfGroups.set(key, { data, timestamp: Date.now() });
53
+ }
54
+ getCFGroup(key) {
55
+ const entry = this.cfGroups.get(key);
56
+ return this.isValid(entry) ? entry.data : null;
57
+ }
58
+ setQualitySize(key, data) {
59
+ this.qualitySizes.set(key, { data, timestamp: Date.now() });
60
+ }
61
+ getQualitySize(key) {
62
+ const entry = this.qualitySizes.get(key);
63
+ return this.isValid(entry) ? entry.data : null;
64
+ }
65
+ setNaming(key, data) {
66
+ this.naming.set(key, { data, timestamp: Date.now() });
67
+ }
68
+ getNaming(key) {
69
+ const entry = this.naming.get(key);
70
+ return this.isValid(entry) ? entry.data : null;
71
+ }
72
+ clear() {
73
+ this.profiles.clear();
74
+ this.profileLists.clear();
75
+ this.customFormats.clear();
76
+ this.cfLists.clear();
77
+ this.cfGroups.clear();
78
+ this.qualitySizes.clear();
79
+ this.naming.clear();
80
+ }
81
+ }
82
+ const cache = new TrashCache();
83
+ // Custom format categories
84
+ const CF_CATEGORIES = {
85
+ hdr: [/hdr/i, /dv/i, /dolby.*vision/i, /hdr10/i],
86
+ audio: [/atmos/i, /dts/i, /truehd/i, /audio/i, /surround/i, /sound/i, /stereo/i, /mono/i, /aac/i, /flac/i],
87
+ resolution: [/1080p/i, /2160p/i, /720p/i, /4k/i, /480p/i],
88
+ source: [/bluray/i, /web/i, /remux/i, /hdtv/i, /dvd/i, /cam/i, /telesync/i],
89
+ streaming: [/amzn/i, /nf\b/i, /netflix/i, /dsnp/i, /disney/i, /atvp/i, /apple/i, /hmax/i, /hbo/i, /hulu/i, /pcok/i, /peacock/i],
90
+ anime: [/anime/i],
91
+ unwanted: [/lq/i, /x265.*hdtv/i, /extras/i, /3d/i, /upscale/i, /bad.*dual/i],
92
+ release: [/repack/i, /proper/i, /scene/i, /p2p/i],
93
+ language: [/french/i, /german/i, /dutch/i, /multi/i, /language/i],
94
+ };
95
+ function categorizeCustomFormat(name) {
96
+ const categories = [];
97
+ for (const [category, patterns] of Object.entries(CF_CATEGORIES)) {
98
+ if (patterns.some(p => p.test(name))) {
99
+ categories.push(category);
100
+ }
101
+ }
102
+ return categories.length > 0 ? categories : ['other'];
103
+ }
104
+ // API functions
105
+ async function fetchJSON(url) {
106
+ const response = await fetch(url);
107
+ if (!response.ok) {
108
+ throw new Error(`Failed to fetch ${url}: ${response.status} ${response.statusText}`);
109
+ }
110
+ return response.json();
111
+ }
112
+ async function listGitHubDir(path) {
113
+ const files = await fetchJSON(`${GITHUB_API_URL}/${path}`);
114
+ return files
115
+ .filter(f => f.type === 'file' && f.name.endsWith('.json'))
116
+ .map(f => f.name.replace('.json', ''));
117
+ }
118
+ // Public API
119
+ export class TrashClient {
120
+ /**
121
+ * List available quality profiles
122
+ */
123
+ async listProfiles(service) {
124
+ // Check cache
125
+ const cached = cache.getProfileList(service);
126
+ if (cached) {
127
+ // Fetch details for each
128
+ const profiles = await Promise.all(cached.map(name => this.getProfile(service, name)));
129
+ return profiles.filter((p) => p !== null).map(p => ({
130
+ name: p.name,
131
+ description: p.trash_description,
132
+ }));
133
+ }
134
+ // Fetch list from GitHub
135
+ const profileNames = await listGitHubDir(`${service}/quality-profiles`);
136
+ cache.setProfileList(service, profileNames);
137
+ // Fetch details
138
+ const profiles = await Promise.all(profileNames.map(name => this.getProfile(service, name)));
139
+ return profiles.filter((p) => p !== null).map(p => ({
140
+ name: p.name,
141
+ description: p.trash_description,
142
+ }));
143
+ }
144
+ /**
145
+ * Get a specific quality profile
146
+ */
147
+ async getProfile(service, profileName) {
148
+ const key = `${service}/${profileName}`;
149
+ const cached = cache.getProfile(key);
150
+ if (cached)
151
+ return cached;
152
+ try {
153
+ const profile = await fetchJSON(`${TRASH_BASE_URL}/${service}/quality-profiles/${profileName}.json`);
154
+ cache.setProfile(key, profile);
155
+ return profile;
156
+ }
157
+ catch {
158
+ return null;
159
+ }
160
+ }
161
+ /**
162
+ * List available custom formats
163
+ */
164
+ async listCustomFormats(service, category) {
165
+ // Check cache
166
+ let cfNames = cache.getCFList(service);
167
+ if (!cfNames) {
168
+ cfNames = await listGitHubDir(`${service}/cf`);
169
+ cache.setCFList(service, cfNames);
170
+ }
171
+ // Fetch details for categorization
172
+ const formats = [];
173
+ // Batch fetch - limit to prevent rate limiting
174
+ const batchSize = 20;
175
+ for (let i = 0; i < cfNames.length; i += batchSize) {
176
+ const batch = cfNames.slice(i, i + batchSize);
177
+ const results = await Promise.all(batch.map(async (name) => {
178
+ const cf = await this.getCustomFormat(service, name);
179
+ if (!cf)
180
+ return null;
181
+ const cats = categorizeCustomFormat(cf.name);
182
+ return {
183
+ name: cf.name,
184
+ categories: cats,
185
+ defaultScore: cf.trash_scores?.default,
186
+ };
187
+ }));
188
+ formats.push(...results.filter((f) => f !== null));
189
+ }
190
+ // Filter by category if specified
191
+ if (category) {
192
+ return formats.filter(f => f.categories.includes(category.toLowerCase()));
193
+ }
194
+ return formats;
195
+ }
196
+ /**
197
+ * Get a specific custom format
198
+ */
199
+ async getCustomFormat(service, cfName) {
200
+ const key = `${service}/${cfName}`;
201
+ const cached = cache.getCustomFormat(key);
202
+ if (cached)
203
+ return cached;
204
+ try {
205
+ const cf = await fetchJSON(`${TRASH_BASE_URL}/${service}/cf/${cfName}.json`);
206
+ cache.setCustomFormat(key, cf);
207
+ return cf;
208
+ }
209
+ catch {
210
+ return null;
211
+ }
212
+ }
213
+ /**
214
+ * Get naming conventions
215
+ */
216
+ async getNaming(service) {
217
+ const cached = cache.getNaming(service);
218
+ if (cached)
219
+ return cached;
220
+ try {
221
+ const naming = await fetchJSON(`${TRASH_BASE_URL}/${service}/naming/${service}-naming.json`);
222
+ cache.setNaming(service, naming);
223
+ return naming;
224
+ }
225
+ catch {
226
+ return null;
227
+ }
228
+ }
229
+ /**
230
+ * Get quality size recommendations
231
+ */
232
+ async getQualitySizes(service, type) {
233
+ const sizeTypes = service === 'radarr'
234
+ ? ['movie', 'anime']
235
+ : ['series', 'anime'];
236
+ const sizes = [];
237
+ for (const sizeType of sizeTypes) {
238
+ const key = `${service}/${sizeType}`;
239
+ let size = cache.getQualitySize(key);
240
+ if (!size) {
241
+ try {
242
+ size = await fetchJSON(`${TRASH_BASE_URL}/${service}/quality-size/${sizeType}.json`);
243
+ cache.setQualitySize(key, size);
244
+ }
245
+ catch {
246
+ continue;
247
+ }
248
+ }
249
+ if (!type || size.type === type) {
250
+ sizes.push(size);
251
+ }
252
+ }
253
+ return sizes;
254
+ }
255
+ /**
256
+ * Get custom format groups
257
+ */
258
+ async listCFGroups(service) {
259
+ return listGitHubDir(`${service}/cf-groups`);
260
+ }
261
+ /**
262
+ * Get a specific CF group
263
+ */
264
+ async getCFGroup(service, groupName) {
265
+ const key = `${service}/${groupName}`;
266
+ const cached = cache.getCFGroup(key);
267
+ if (cached)
268
+ return cached;
269
+ try {
270
+ const group = await fetchJSON(`${TRASH_BASE_URL}/${service}/cf-groups/${groupName}.json`);
271
+ cache.setCFGroup(key, group);
272
+ return group;
273
+ }
274
+ catch {
275
+ return null;
276
+ }
277
+ }
278
+ /**
279
+ * Clear the cache (force refresh)
280
+ */
281
+ clearCache() {
282
+ cache.clear();
283
+ }
284
+ }
285
+ // Singleton instance
286
+ export const trashClient = new TrashClient();
287
+ //# sourceMappingURL=trash-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trash-client.js","sourceRoot":"","sources":["../src/trash-client.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@thelord/mcp-arr",
3
+ "version": "1.0.0",
4
+ "mcpName": "io.github.gilberth/mcp-arr",
5
+ "description": "MCP server for *arr media management suite - Sonarr, Radarr, Lidarr, Readarr, Prowlarr, Lingarr (subtitle translation)",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "type": "module",
9
+ "bin": {
10
+ "mcp-arr": "./dist/index.js"
11
+ },
12
+ "files": [
13
+ "dist",
14
+ "LICENSE",
15
+ "README.md"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "watch": "tsc --watch",
20
+ "prepublishOnly": "npm run build"
21
+ },
22
+ "keywords": [
23
+ "mcp",
24
+ "sonarr",
25
+ "radarr",
26
+ "lidarr",
27
+ "readarr",
28
+ "prowlarr",
29
+ "lingarr",
30
+ "subtitles",
31
+ "translation",
32
+ "media",
33
+ "plex",
34
+ "jellyfin",
35
+ "emby",
36
+ "model-context-protocol",
37
+ "claude",
38
+ "ai",
39
+ "arr"
40
+ ],
41
+ "author": "Gilberth (fork of mcp-arr by Jim Christian)",
42
+ "license": "MIT",
43
+ "dependencies": {
44
+ "@modelcontextprotocol/sdk": "^1.0.0"
45
+ },
46
+ "devDependencies": {
47
+ "@types/node": "^20.10.0",
48
+ "typescript": "^5.3.0"
49
+ },
50
+ "engines": {
51
+ "node": ">=18.0.0"
52
+ },
53
+ "repository": {
54
+ "type": "git",
55
+ "url": "https://github.com/gilberth/mcp-arr.git"
56
+ },
57
+ "homepage": "https://github.com/gilberth/mcp-arr#readme",
58
+ "bugs": {
59
+ "url": "https://github.com/gilberth/mcp-arr/issues"
60
+ }
61
+ }