quality_profiles
List and recommend quality profiles for media services to optimize download settings and ensure consistent media quality standards.
Instructions
List available quality profiles with recommendations
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| service | Yes |
Implementation Reference
- src/services/shared.ts:501-531 (handler)Core handler implementation that fetches quality profiles from the ARR API (/qualityprofile), maps response data, selects a recommended profile using helper, and returns structured OperationResult<QualityProfileData>.async listQualityProfiles(): Promise<OperationResult<QualityProfileData>> { debugOperation(this.serviceName, "listQualityProfiles"); try { const response: QualityProfile[] = await fetchJson( this.buildApiUrl("/qualityprofile"), ); const profiles = Array.isArray(response) ? response : []; const profileData = profiles.map((profile: QualityProfile) => ({ id: profile.id, name: profile.name, upgradeAllowed: profile.upgradeAllowed, cutoff: profile.cutoff, })); const recommendedId = this.selectBestQualityProfile(profiles); return { ok: true, data: { service: this.serviceName, mediaKind: this.mediaKind, total: profileData.length, profiles: profileData, recommended: recommendedId ?? undefined, }, }; } catch (error) { return handleError(error, this.serviceName); } }
- src/index.ts:126-133 (registration)MCP tool registration in the tools array, defining name, description, and inputSchema requiring 'service'.name: "quality_profiles", description: "List available quality profiles with recommendations", inputSchema: { type: "object", properties: { service: { type: "string" } }, required: ["service"], }, },
- src/index.ts:324-325 (handler)Dispatch handler in the main CallToolRequestSchema switch statement that invokes the service.listQualityProfiles() method.case "quality_profiles": return await service.listQualityProfiles();
- src/services/base.ts:168-174 (schema)TypeScript interface defining the output structure for quality profiles data returned by the handler.export interface QualityProfileData { service: string; mediaKind: "series" | "movie"; total: number; profiles: QualityProfile[]; recommended?: number; }
- src/services/shared.ts:852-897 (helper)Helper method to intelligently select the best quality profile based on service name patterns (e.g., 4K, HD, anime) for recommendations and auto-add.private selectBestQualityProfile(profiles: QualityProfile[]): number | null { // Sort profiles by preference based on service name patterns and common naming const serviceName = this.serviceName.toLowerCase(); // Define quality profile preferences based on service naming patterns const qualityPreferences = [ // 4K/UHD service patterns ...(serviceName.includes("4k") || serviceName.includes("uhd") || serviceName.includes("2160") ? [/4k|uhd|2160p?/i, /ultra.*hd|hd.*ultra/i] : []), // HD/1080p service patterns ...(serviceName.includes("hd") || serviceName.includes("1080") ? [/1080p?|hd(?!\s*4k)/i, /high.*def|def.*high/i] : []), // Anime-specific patterns ...(serviceName.includes("anime") ? [/anime/i] : []), // General fallback patterns (prefer common resolutions) /1080p?/i, /720p?/i, /any|default|standard/i, ]; // Try to find a profile matching our preferences for (const pattern of qualityPreferences) { const matchingProfile = profiles.find((profile: QualityProfile) => pattern.test(profile.name), ); if (matchingProfile) { return matchingProfile.id; } } // If no smart match found, use the first profile but only if there's exactly one // This prevents accidentally selecting a random profile when multiple exist if (profiles.length === 1) { return profiles[0]?.id || null; } // Multiple profiles available but no smart match - require explicit selection return null; }