用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/majiayu000/claude-skill-registry --skill jellyfin-api命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
LLM token logprobs and calibration. Per-decision confidence, ECE, Brier, reliability diagrams, low-confidence triage.
Analyze LLM token logprobs and calibration. Use for per-decision confidence, ECE, Brier scores, reliability diagrams, and low-confidence triage.
回顾最近 N 天的 Claude Code 使用记录——扫描原始会话数据,按主题分组汇总"我都做了什么",并从个人操作系统视角输出模式、风险与增删建议。当用户说 /recap、"看看我这几天做了什么"、"回顾一下我最近的会话"、"这两天我用 claude 干了啥"、"活动回顾" 时使用。
基于 SOC 职业分类
正在显示 SKILL.md
| name | jellyfin-api |
| description | Jellyfin API patterns and JellyfinClient usage for MyFlix |
Apply when making API calls, handling authentication, or working with media data.
// Configure after authentication
jellyfinClient.configure(
serverUrl = "https://jellyfin.example.com",
accessToken = authResponse.accessToken,
userId = authResponse.user.id,
deviceId = "myflix_${System.currentTimeMillis()}"
)
// Check auth status
if (jellyfinClient.isAuthenticated) { /* proceed */ }
// Logout
jellyfinClient.logout()
jellyfinClient.getLibraries().onSuccess { libraries ->
val moviesLib = LibraryFinder.findMoviesLibrary(libraries)
val showsLib = LibraryFinder.findShowsLibrary(libraries)
}
// Latest movies (excludes collections)
jellyfinClient.getLatestMovies(libraryId, limit = 12)
// Latest series (new shows, not episodes)
jellyfinClient.getLatestSeries(libraryId, limit = 12)
// Latest episodes
jellyfinClient.getLatestEpisodes(libraryId, limit = 12)
// Continue watching (in progress)
jellyfinClient.getResume(limit = 12)
// Next episodes to watch
jellyfinClient.getNextUp(limit = 12)
// Full item details
jellyfinClient.getItem(itemId).onSuccess { item ->
// Access: item.name, item.overview, item.genres, etc.
}
// Series seasons
jellyfinClient.getSeasons(seriesId)
// Season episodes
jellyfinClient.getEpisodes(seriesId, seasonId)
// Similar items
jellyfinClient.getSimilarItems(itemId, limit = 12)
// All collections
jellyfinClient.getCollections()
// Collection items
jellyfinClient.getCollectionItems(collectionId)
// Available genres
jellyfinClient.getGenres(libraryId)
// Items by genre
jellyfinClient.getItemsByGenre(genreName, libraryId, limit = 20)
jellyfinClient.search(query, limit = 20)
// Primary poster (portrait 2:3)
jellyfinClient.getPrimaryImageUrl(itemId, imageTag, maxWidth = 400)
// Backdrop (landscape 16:9)
jellyfinClient.getBackdropUrl(itemId, backdropTag, maxWidth = 1920)
// Thumbnail
jellyfinClient.getThumbUrl(itemId, thumbTag, maxWidth = 600)
// Blurred backdrop for backgrounds
jellyfinClient.getBlurredBackdropUrl(itemId, backdropTag, blur = 20)
// User avatar
jellyfinClient.getUserImageUrl(userId)
// Start playback
jellyfinClient.reportPlaybackStart(itemId, mediaSourceId, positionTicks = 0)
// Progress updates (call every 10 seconds)
jellyfinClient.reportPlaybackProgress(itemId, positionTicks, isPaused = false)
// Stop playback
jellyfinClient.reportPlaybackStopped(itemId, positionTicks)
// Mark watched/unwatched
jellyfinClient.setPlayed(itemId, played = true)
// Toggle favorite
jellyfinClient.setFavorite(itemId, favorite = true)
// Clear all cache (before refresh)
jellyfinClient.clearCache()
// Invalidate specific caches
jellyfinClient.invalidateCache("resume", "nextup", "item:$itemId")
The client optimizes requests by selecting only needed fields:
CARD: Overview, ImageTags, BackdropImageTags, UserData, RatingsEPISODE_CARD: Above + SeriesName, SeasonNameDETAIL: Full info including MediaSources, Genres, People, etc.SERIES_DETAIL: Above + ChildCount, RecursiveItemCountdata class JellyfinItem(
val id: String,
val name: String,
val type: String, // "Movie", "Series", "Episode", "BoxSet"
val overview: String?,
val productionYear: Int?,
val officialRating: String?, // "PG-13", "TV-MA"
val communityRating: Float?, // 0-10
val criticRating: Int?, // Rotten Tomatoes 0-100
val runTimeTicks: Long?,
val seriesId: String?, // For episodes
val seriesName: String?,
val seasonName: String?,
val indexNumber: Int?, // Episode number
val parentIndexNumber: Int?, // Season number
val imageTags: ImageTags?,
val backdropImageTags: List<String>?,
val userData: UserData?,
val premiereDate: String?,
val status: String?, // "Ended", "Continuing"
val genres: List<String>?,
val studios: List<Studio>?,
val people: List<Person>?,
val mediaSources: List<MediaSource>?,
val mediaStreams: List<MediaStream>?
)
data class UserData(
val playbackPositionTicks: Long?,
val playCount: Int?,
val isFavorite: Boolean,
val played: Boolean,
val lastPlayedDate: String?
)
jellyfinClient.quickConnectFlow(serverUrl).collect { state ->
when (state) {
is QuickConnectFlowState.WaitingForApproval -> {
// Display state.code to user
}
is QuickConnectFlowState.Authenticated -> {
// Save state.authResponse
}
is QuickConnectFlowState.Error -> {
// Handle state.message
}
}
}
jellyfinClient.authenticate(serverUrl, username, password)
.onSuccess { authResponse ->
jellyfinClient.configure(
serverUrl,
authResponse.accessToken,
authResponse.user.id,
deviceId
)
}
suspend fun loadData() {
isLoading = true
errorMessage = null
jellyfinClient.getData()
.onSuccess { data ->
items = data
}
.onFailure { e ->
errorMessage = "Failed to load: ${e.message ?: "Unknown error"}"
}
isLoading = false
}