PhotoPrism 后端代码地图(CODEMAP):从入口到源码的快速导航指南
后端前端图像处理人工智能AI 应用【免费下载链接】photoprismAI-Powered Photos App ✨项目地址https://gitcode.com/gh_mirrors/ph/photoprism点击查看免费下载PhotoPrism 是一个基于 Go 与 Vue 构建的 AI 照片管理应用其仓库体量庞大internal/、pkg/、cmd/、frontend/下分布着数百个包与数千个文件。为了让贡献者、Agent 与调试者快速定位代码、理解模块之间的协作关系仓库在根目录维护了 CODEMAP.md后端部分另有 frontend/CODEMAP.md 覆盖前端。本文以该文档为骨架结合仓库源码与 Makefile系统梳理 PhotoPrism 后端的入口、包地图、配置体系、API 组织、安全热区与常见开发任务帮助你不用地毯式搜索就能增改功能、修复缺陷并编写测试。快速开始两种开发环境的启动路径CODEMAP 明确给出了两条开发路径——推荐在 dev container 内工作宿主机则负责管理 Docker。容器内开发推荐make dep # 安装 Go / JS 依赖 make build-go # 构建后端二进制 make lint-go # 运行 golangci-lint使用 .golangci.yml只输出问题不失败 make lint # 运行全部 lint 与仓库检查 ./photoprism start # 启动服务启动后访问http://localhost:2342/或在使用 Traefik 时访问https://app.localssl.dev/本地 TLS 由 Traefik 提供见 AGENTS.md。宿主机开发管理 Dockermake docker-build # 构建镜像 docker compose up -d # 启动服务 docker compose logs -f --tail100 photoprism从 Makefile 可以看到dep实际是dep-models dep-jsbuild-go走build-developtest-go通过scripts/test/time.sh包裹执行Makefile。这也是 CODEMAP 反复强调的准则Makefile targets 是构建、格式化与测试的权威入口。可执行文件与入口点CLI 应用二进制名统一为photoprism主入口在 cmd/photoprism/photoprism.go。该文件用 urfave/cli v2 组装应用app.Flags config.Flags.Cli() app.Commands commands.PhotoPrism命令注册表是internal/commands/commands.go中的commands.PhotoPrism数组commands.go其中包含Start、Index、Import、Migrate、Backup、Users、Clients、Cluster、Auth、MCP、Show等 30 个子命令。internal/commands/catalog子包则提供 DTO 与构建器用于枚举命令/标志并渲染 Markdown 形式的 CLI 文档最终由photoprism show commands输出。CLI 还封装了完整的交互确认机制ConfirmAction会在破坏性操作前弹出 yes/no 提示支持通过PHOTOPRISM_CLInoninteractive环境变量或--yes跳过见 commands.goExitCode统一将取消操作/中断提示映射为退出码 0、缺少必需标志映射为 2commands.go。Web 服务器启动链路internal/commands/start.go→server.Start同时拉起 HTTP(S)、后台 workers 与 session 清理。HTTP 服务器internal/server/start.go 负责压缩、安全中间件、healthz/readiness、TLS/AutoTLSgolang.org/x/crypto/acme/autocert与 Unix socket。路由注册internal/server/routes.go 统一注册 UI、WebDAV、分享/s开头、.well-known发现路由以及全部/api/v1/*分组。API 分组APIv1 router.Group(conf.BaseUri(/api/v1), Api(conf))该分组变量定义于 internal/server/routes.go在 internal/server/start.go 中创建。Go 包地图各司其职的分层CODEMAP 提供了一张高层包地图是理解整个后端的关键包职责internal/apiGin 处理器与 Swagger 注解只做胶水不含业务逻辑internal/commandsCLI 命令定义与编排start、index、import、migrate等catalog子包输出 CLI 文档internal/serverHTTP 服务器、中间件、路由、静态资源/UI/WebDAVinternal/config配置、flags/env/options、客户端配置、DB 初始化与迁移internal/entityGORM v1 模型、查询、搜索辅助与迁移internal/photoprism核心领域逻辑索引、导入、人脸、缩略图、清理internal/ai/vision多引擎计算机视觉管线模型、适配器、schema适配器文档见 internal/ai/vision/openai/README.md 与 internal/ai/vision/ollama/README.mdinternal/ai/onnx共享 ONNX 模型描述与会话构建工件身份/校验和、图检查、预处理契约、运行时加载、执行提供者选择当前由internal/ai/face消费见 internal/ai/onnx/README.mdinternal/ai/face人脸检测与特征嵌入由FACE_DETECTOR选择的检测器注册表、由FACE_MODEL选择的嵌入模型注册表、关键点对齐与距离阈值见 internal/ai/face/README.mdinternal/workers后台调度器index、vision、sync、meta、backupinternal/authACL、会话、OIDCinternal/service集群/门户、地图、hub、webdavinternal/event日志、pub/sub、审计规范化的结果令牌位于pkg/log/status用status.Error(err)这类辅助函数把净化后的消息作为 outcome文档见 internal/event/README.mdinternal/ffmpeg、internal/thumb、internal/meta、internal/form、internal/mutex媒体、缩略图、元数据、表单、协调pkg/*可复用工具严禁 importinternal/*例如pkg/clean、pkg/enum、pkg/fs、pkg/txt、pkg/http/header、pkg/authn/authtoken几个值得注意的实现细节internal/entity中的标签查找辅助函数集中在internal/entity/label*.go应复用FindLabels(...)、FindLabelIDs(...)与LabelSlugs(...)做同音词感知的精确名称/slug 解析而不是在调用方重复手写 slug SQL。WebDAV 客户端internal/service/webdav/README.md的递归目录发现优先使用PROPFIND Depth: infinity对不兼容服务器回退为迭代式Depth: 1遍历隐藏点文件与隐藏点目录内的条目会被排除它们通常是锁文件、半截上传或服务商元数据控制类操作Files、Directories、Mkdir、Delete受服务超时约束而Upload/Download刻意避免总请求 deadline改用连接级保护。模板与静态资源入口 HTML 位于 assets/templates/index.gohtml其中包含app.gohtml的 splash 标记与app.js.gohtml的 SPA 加载器。OIDC 登录完成经由 assets/templates/auth.gohtml 桥接它会清除 legacy/namespaced 会话键并把会话写入frontend/src/page/auth/login.vue登录 UI 开关所选择的浏览器存储。浏览器能力检查逻辑在 assets/static/js/browser-check.js经app.js.gohtml引入在主 bundle 运行前检查 Promise、fetch、AbortController、script.noModule等能力。脚本标签顺序不能改动确保浏览器检查先于主 bundle 执行。assets/templates/splash.gohtml 渲染 bundle 加载期间的加载屏文字样式在 frontend/src/css/splash.css。调整浏览器支持提示时需要同步更新 loader partial 与 splash 样式保证跨版本的警告文案一致。Service worker 路由位于internal/server/routes_webapp.gosw.js、sw-scope-cleanup.js与 Workbox 运行时文件/workbox-:hash的处理器都定义在那里使 service worker 在站点根路径与 base URI 下都能运行注意 Gin 的:hash参数不含.js后缀handler/test 需要手动匹配完整文件名。HTTP API组织、注解与生成Handler 全部位于internal/api/*.go注册于internal/server/routes.go。新端点必须在 handler 文件中加 Swagger 注解然后用make fmt-go swag-fmt make swag生成文档不要手工编辑internal/api/swagger.json。Swagger 注意事项每个Router注解都要写完整的/api/v1/...前缀与分组前缀一致只注解公开 handler跳过内部辅助函数以免生成杂散通用路径make swag-json会运行swaggerfix稳定化步骤去重time.Duration的重复枚举——API 中时长一律使用整型纳秒。/api/v1/metricsinternal/api/metrics.go暴露 Prometheus 指标包括来自config.Usage()的缓存文件系统/账户用量、注册用户/访客总数以及NodeRoleportal时的门户集群节点数响应使用标准 Prometheus 文本格式text/plain; version0.0.4。routes.go中的常见分组sessions、OAuth/OIDC、config、users、services、thumbnails、video、downloads/zip、index/import、photos/files/labels/subjects/faces、batch ops、cluster以及技术类metrics、status、echo。隐藏搜索行为供配置的前端 URI 下的隐藏路由使用CE/Plus/Pro 默认/library/hidden、Portal 默认/portal/hidden实现在internal/entity/search/photos.gofrm.Hidden强制photos.photo_quality -1且photos.deleted_at IS NULL非隐藏搜索默认排除出错文件files.file_error 除非显式设置frm.Error。搜索 DTOinternal/entity/search/photos_results.go暴露FileErrorfiles.file_error客户端无需先加载完整文件详情即可渲染隐藏原因。配置与标志三层来源与优先级配置系统是 PhotoPrism 最常被触碰的部分核心结构如下Options 结构体internal/config/options.go 中每个字段同时带有yaml:…用于defaults.yml/options.yml、json:…用于客户端/API与flag:…用于 CLI 标志/环境变量三类标签。关键约定密钥/内部字段用json:-禁止 JSON 序列化防止值经 API 泄露见 internal/api/config_options.go必要时yaml:-禁用 YAML 处理flag:-阻止ApplyCliContext()为字段赋 CLI 值不影响 internal/config/flags.go 中的标志定义注解可携带版本标签如tags:plus,pro控制可见性逻辑见internal/config/options_report.go。全局标志/环境变量internal/config/flags.go 中的EnvVars(...)可用清单由internal/config/cli_flags_report.gointernal/config/report_sections.go汇总经photoprism show config-options --md/--json输出YAML 选项映射经internal/config/options_report.go输出为photoprism show config-yaml --md/--json当前值报告在internal/config/report.go经photoprism show config别名photoprism config --md输出命令目录在internal/commands/show_commands.go经photoprism show commands输出默认 Markdown--json可选--nested输出树形--all含隐藏命令/标志。优先级defaults.yml CLI/env options.yml全局 options 规则即高优先级覆盖低优先级。配置自有的持久化辅助Config.SaveOptionsPatch(...)internal/config/config.go负责通用options.yml合并/写入/重载Config.SaveClusterOptionsUpdate(...)internal/config/config_cluster.go负责集群元数据更新ClusterUUID、NodeUUID、NodeClientID、DB 字段等。Getter 按主题分组DB 在internal/config/config_db.go、服务器在config_server.go、TLS 在config_tls.go等。Client Config只读端点GET /api/v1/configinternal/api/api_client_config.go。CDN 行为携带 CDN 头的请求一律返回404防止公开与会话专属配置负载之间的中间缓存串扰。组装由internal/config/client_config.go构建不是 Options 的直接序列化叠加通过config.Register在internal/config/extensions.go注册的扩展值。更新后端在变更后调用UpdateClientConfig()经 websocket 发布config.updated事件见internal/api/config_options.go与internal/api/config_settings.go。ACL/模式感知值按用户/会话过滤公开用户与认证用户的返回可能不同不要暴露密钥——把它视为客户端可见数据新增字段应通过config.Register扩展而非直接暴露 Options。刷新节奏Web UI非移动端每 10 分钟通过frontend/src/app.js中的$config.update()轮询作为 websocket 推送的补充。OIDC GroupsPro 专属配置项pro标签CE 中隐藏标志oidc-group-claim默认groups、oidc-group必需的成员列表、oidc-group-roleGROUPROLE映射。解析辅助internal/auth/oidc/groups.go规范化 ID、检测 Entra_claim_names溢出、映射 group→role并在internal/api/oidc_redirect.go中强制执行必需成员关系。溢出场景如果存在_claim_names.groups但未返回任何 groups且配置了必需 group则登录失败Graph 拉取尚未实现。数据库与迁移驱动GORM v1github.com/jinzhu/gorm没有WithContext裸 SQL 用db.Raw(stmt).Scan(nop)。实体与辅助internal/entity/*.go及子包query、search、sortby。迁移引擎internal/entity/migrate/*通过config.MigrateDb()执行CLI 为photoprism migrate/photoprism migrations。DB 初始化/迁移流程internal/config/config_db.go选择驱动/DSN、设置gorm:table_options然后entity.InitDb(migrate.Opt(...))。认证授权与会话会话模型与缓存internal/entity/auth_session*与internal/auth/session/*含清理 workerinternal/entity/auth_session_jwt.go从门户签发的 JWT 构建瞬时会话供 internal/api/api_auth_jwt.go 在节点认证门户请求时使用。ACLinternal/auth/acl/* 提供角色、授权、作用域务必使用常量避免记录密钥令牌比较要常数时间作用域检查用acl.ScopePermits/ScopeAttrPermits不要自己写解析逻辑。OIDCinternal/auth/oidc/*。URL 令牌签名下载、预览pkg/authn/authtoken是无依赖的底层原语签发/校验 bunny.net 兼容的 HMAC-SHA256 令牌格式文档见 pkg/authn/authtoken/README.mdinternal/auth/tokens是应用层装配——每种用途一个Signer目前是Download预览将跟进、投递策略DownloadToken/SignDownload/VerifyDownload/IsCoarseDownload以及Derive用于尚未签名的预览令牌。完整细节含投递规则与测试注意点见 internal/auth/tokens/README.md。下载令牌是无状态的——不存储每个会话/用户的数据。请求侧解析在 internal/api/auth_tokens.goAuthDownload(c)是端点使用的合并门禁session-or-coarse 授权 单次调用内解析会话集中审计拒绝类似AuthAnyInvalidDownloadToken是薄封装DownloadSession把签名的?t令牌解析为会话——在令牌之前还接受请求头中的 Portal 集群 JWTauthAnyJWT要求acl.AccessAll文件权限因此只有可信的全权限主体才合格。消费方DownloadAlbuminternal/api/download_album.go、GetDownloadinternal/api/download.go、GetPhotoDownloadinternal/api/photos.go、ZipDownloadinternal/api/zip.go。媒体处理缩略图internal/thumb/*与internal/photoprism/mediafile_thumbs.go中的辅助函数。元数据internal/meta/*FFmpeg 集成internal/ffmpeg/*文档见 internal/ffmpeg/README.md、internal/meta/README.md。360° 原始文件Insta360.insp/.insv与.lrv代理、鱼眼 DNG在pkg/fs/file_types.go与pkg/media/insta360.go中识别投影词汇在pkg/media/projection检测与拍摄分组逻辑在internal/photoprism/mediafile_insta360.go/mediafile_projection.gofs.StackPrefixpkg/fs/stack.go给一次拍摄的所有文件统一的_00stack 名internal/ffmpeg/v360.go构建去畸变命令由convert_image*.go与convert_video_avc.go执行始终写入衍生文件、绝不触碰原始文件。只有等距柱状equirectangular衍生文件才上报给查看器internal/entity/search/photos_results.go中的sphereProjectionfisheye:则定位其背后的原始文件。HEIF 工具链发行二进制位于scripts/dist/install-libheif.sh发布前用make build-libheif-*封装scripts/dist/build-libheif.sh为每个支持的发行版/架构重新生成归档。文件夹相册一致性internal/entity/folder.go让FindFolder(...)保持 unscoped以处理创建/索引冲突——软删除行不会导致反复 insert/fail/not-found 循环internal/photoprism/index.go只在强制重扫时、文件遍历之后运行entity.ReconcileOriginalsFolderAlbums(...)让常规索引保持轻量而完整重扫修复过期/缺失的文件夹相册。后台 Worker调度器与 worker 在internal/workers/*.goindex、vision、meta、sync、backup、share由internal/commands/start.go启动自动索引器在internal/workers/auto/*。集群 / 门户Cluster / Portal节点类型internal/service/cluster/const.gocluster.RoleInstance、cluster.RolePortal、cluster.RoleService。节点引导与注册internal/service/cluster/node/*经 HTTP 与 Portal 通信不 import Portal 内部实现。注册现在会在 401/403 时用 join token 轮换节点客户端密钥并重试一次持久化新凭据若 secrets 目录只读则回退到内存存储主题同步会在刷新/轮换发生时显式记日志便于运维在标准日志级别追踪凭据变动。注册表/供应器internal/service/cluster/registry/*、internal/service/cluster/provisioner/*。主题端点服务端GET /api/v1/cluster/theme客户端/CLI 仅在主题缺失或没有app.js时安装。Portal 专属扩展portal/internal/portalPortal 默认值、标志、供应选项、/i/*代理路由。集群注册表速查UUID 优先贯穿所有 API 路径{uuid}与注册表Get/Delete/RotateSecretOAuth 用显式FindByClientID供应器命名使用 HMACbase32(ClusterUUIDNodeUUID)而非 slug数据库cluster_dhmac11、用户名cluster_uhmac11驱动目前为mysql|mariadbDSN 构建用BuildDSN(driver, host, port, user, pass, name)不支持驱动时告警并回退 MySQL 格式公共 API 与内部注册表 DTO 使用规范化字段名Database含Name/User/Driver/RotatedAt节点级轮换时间戳为RotatedAtphotoprism cluster register支持--site-url与--advertise-url两者总是转发给 Portal自动 MariaDB 凭据轮换逻辑在config.ShouldAutoRotateDatabase()CLI 与节点引导共用。服务器启动流程正常路径photoprism startCLI→internal/commands/start.go配置初始化、DB 初始化/迁移、会话清理 workerinternal/server/start.go构建 Gin 引擎、中间件、API 分组、模板internal/server/routes.go注册 UI、WebDAV、分享、well-known 与全部/api/v1/*路由Workers 与自动索引启动/livez、/readyz健康端点可用。/livez及/health、/healthz始终返回 200 OK/readyz在conf.IsReady()为真时返回 200否则返回 503见 internal/server/start.go。常见开发任务实战添加一个 CLI 命令在internal/commands/name.go创建*cli.Command把它加入internal/commands/commands.go的PhotoPrism数组测试优先使用internal/commands/commands_test.go中的RunWithTestContext避免os.Exit打断测试进程。添加一个 REST 端点在internal/api/area.go创建带 Swagger 注解的 handler在internal/server/routes.go注册复用辅助api.ClientIP(c)、header.BearerToken(c)、Abort*系列函数列表端点校验分页边界默认count100最大1000offset0运行make fmt-go swag-fmt make swag保持文档准确测试go test ./internal/api -run Name借助NewApiTest()、PerformRequest*聚焦辅助。添加一个配置选项在internal/config/options.go加带标签的字段在internal/config/flags.go通过EnvVars(...)注册 CLI 标志/环境变量暴露 getter例如在config_server.go或对应主题文件按options.go中的同位顺序把该选项追加到*config.Report()的rows若值需持久化写回options.yml并重载到内存——优先用Config.SaveOptionsPatch(...)及相关配置自有辅助不要临时写 YAML 逻辑需要 defaults/options/settings 文件路径时调用pkg/fs.ConfigFilePath保证.yml与.yaml可互换测试覆盖 CLI/env/file 优先级见internal/config/test.go辅助。触碰 DB schema使用 GORM 自动迁移或在internal/entity/migrate/dialect/...添加自定义迁移然后运行go generate或make generate对全部包执行go generate通过config_db.go审查/提升migrate.Version的版本门控测试默认跑 SQLiteMySQL 场景需恰当门控。测试全量、聚焦与技巧全量套件make test前端 后端仅后端make test-gomake test-short跳过在 fixture 媒体上跑索引器/导入器的测试。聚焦包go test ./internal/pkg -run Name。CLI 测试设PHOTOPRISM_CLInoninteractive或传--yes避免提示用RunWithTestContext防止os.Exit。测试中的 SQLite DSN 每套件独立非空若捕获了 DSN 要清理文件。前端单测用 Vitest独立于后端见 frontend/CODEMAP.md。配置辅助会自动禁用测试中的 Hub 服务调用hub.ApplyTestConfig()测试配置自动发现仓库assets/目录除非布局特殊否则不要为各包添加PHOTOPRISM_ASSETS_PATHshim。快速测试配方go test ./pkg/fs -run Copy|Move|Unzip -count1文件系统归档、go test ./pkg/media/... -count1媒体辅助、go test ./internal/thumb/... -count1libvips 缩略图、go test ./internal/ffmpeg -run Remux|Transcode|Extract -count1FFmpeg 命令构建。安全热区加固要点速查Zip 解压路径穿越防护pkg/fs/zip.go 用safeJoin拒绝绝对/卷路径与..穿越并强制单文件与总量上限测试pkg/fs/zip_test.go覆盖 abs/volume/..与限额。强感知 Copy/Move 与防截断写入应用辅助在internal/photoprism/mediafile.goMediaFile.Copy/Move带force工具在pkg/fs/copy_move.gofs.Copy/fs.Move用O_TRUNC避免尾部残留字节。FFmpeg 命令构建与编码器核心在internal/ffmpeg/transcode_cmd.go、remux.go、v360.go编码器仅字符串构建在internal/ffmpeg/{apple,intel,nvidia,vaapi,v4l}/avc.go测试用PHOTOPRISM_FFMPEG_ENCODER门控硬件运行否则只断言命令字符串与负向路径。libvips 缩略图管线在internal/thumb/vips.goVips渲染入口、导出参数、初始化vips_init.goVipsInit、旋转vips_rotate.goVipsRotate、格式转换vips_convert.govipsConvertHEIC/AVIF 经 libheif尺寸与命名在internal/thumb/sizes.goMaxSize、MaxRenderSize、InvalidSize、size.goUncached、ExceedsLimit、Clamp、Limit、fit.goFitSizes、FitBounds、names.go、filter.go人脸/标记裁剪辅助在internal/thumb/crop如ParseThumb、IsCroppedThumb端点internal/api/thumbnails.goGetThumb、albums_cover.goAlbumCover、共享coverSize、labels_cover.goLabelCover、folders_cover.goFolderCover响应与封面缓存在internal/api/cache.go。安全 HTTP 下载器共享工具pkg/http/safeDownload、Optionsscheme 白名单http/https、DNS 前 每次重定向的 hostname/IP 校验、最终对端 IP 检查、大小与超时强制、临时文件0600 rename头像封装internal/thumb/avatar.SafeDownload采用更严格默认15s、10 MiB、AllowPrivatefalse、面向图片的Accept测试go test ./pkg/http/safe -count1含重定向 SSRF 用例、go test ./internal/thumb/avatar -count1。凭据流的 CDN 防护认证/会话与 OAuth/OIDC 端点拒绝 CDN 标记请求集群引导端点POST /api/v1/cluster/nodes/register同样拒绝 CDN 标记请求避免缓存可能含引导密钥的响应。通用约定与规则包边界pkg/*不得 importinternal/*Go 工具链也会阻止internal/被/tmp等目录 import临时辅助代码请放internal/tmp/之类的路径。HTTP 头优先使用pkg/http/header的常量/辅助不要写字符串字面量。安全绝不记录密钥令牌比较用常数时间。集群实例/服务引导不要 import Portal 内部实现一律走 HTTP。测试偏好小型封闭单测用t.TempDir()与PHOTOPRISM_STORAGE_PATH等环境变量隔离文件系统路径。集群节点标识用 UUID v7内部存为NodeUUIDAPI/CLI 暴露为UUIDOAuth 客户端 IDNodeClientID暴露为ClientID仅用于 OAuth注册表查询与 CLI 命令接受 UUID、ClientID 或 DNS 标签名按该优先级。文件系统权限与 io/fs 别名创建文件/目录必须使用pkg/fs权限变量——fs.ModeDirumask 前 0o777、fs.ModeFile0o666、fs.ModeConfigFile0o664、fs.ModeSecretFile0o600、fs.ModeBackupFile0o600——这些是传给 create 调用的模式之后由进程 umask 过滤不要把 stdlibio/fs的 mode 位当权限参数用import stdlibio/fs时要别名iofs/gofs避免与自有包冲突文件系统路径用filepath.JoinURL 路径用path.Join。命名与测试风格Go 测试放在源码旁file_test.go相关用例用t.Run(...)子测试分组表驱动更佳子测试名用 PascalCase。集群 DTO 字段Database而非db含Name、User、Driver、RotatedAt注册返回Secrets.ClientSecretCLI 持久化到配置NodeClientSecret管理员响应可能含AdvertiseUrl与Database非管理员响应默认脱敏。常用 Make Targets 速查Target作用make help常用目标概览make list列出全部make dep在容器内安装 Go/JS 依赖make build-go构建后端make test-go后端测试SQLitemake test-short快速测试跳过 fixture 媒体上的索引/导入make swag生成internal/api/swagger.jsonmake fmt-go swag-fmt格式化 Go 代码与 Swagger 注解make lint/make lint-go全量 / Go 专项 lintgolangci-lintmake docker-build构建 Docker 镜像下载CLI与 yt-dlp 辅助也有专门的地图命令与核心在internal/commands/download.go与download_impl.goyt-dlp 封装在internal/photoprism/dl/options.go的参数接线含FFmpegPostArgs钩子、info.go元数据发现、file.go的--output/--print文件方法、meta.go的CreatedFromInfo回退与RemuxOptionsFromInfo导入器在internal/photoprism/get/import.go工作池与import_options.goImportOptionsMove/Copy。测试提示go test ./internal/photoprism/dl -run Options|Created|PostprocessorArgs -count1、go test ./internal/commands -run DownloadImpl|HelpFlags -count1不需要 FFmpeg 时设FFmpegBin /bin/false、Settings.Index.Convertfalse用打印 JSON 的 shell 脚本 stub yt-dlp避免导入去重可改变文件字节如YTDLP_DUMMY_CONTENT或目标路径。延伸阅读AGENTS.md仓库级规则与 Agent 提示Sources of Truth 中列出了 Makefile、Setup/Test/API 指南、GLOSSARY.md 等权威来源frontend/CODEMAP.md前端Vue 3 Vuetify 4代码地图包级文档internal/、pkg/、frontend/下各README.md尤其是 internal/ai/face/README.md、internal/ai/onnx/README.md、internal/ai/vision/README.md、internal/ffmpeg/README.md、internal/meta/README.md、pkg/authn/authtoken/README.md 与 internal/auth/tokens/README.md。这份代码地图的价值在于它把文件在哪里和它们如何协作压缩成一张可执行的知识表。无论是新增配置项、注册 REST 端点、扩展 OIDC 组映射还是排查缩略图渲染与安全下载的边界沿着 CODEMAP 标注的路径都能在几次跳转内抵达目标源码——这正是为 Agent 与贡献者设计的导航效率。赞分享后端前端图像处理人工智能AI 应用【免费下载链接】photoprismAI-Powered Photos App ✨项目地址https://gitcode.com/gh_mirrors/ph/photoprism点击查看免费下载相关推荐PhotoPrism 前端代码地图Vue 3 Vuetify 4 架构、模块导航与安全改动指南PhotoPrism 前端代码地图Vue 3 Vuetify 4 架构、模块导航与安全改动指南 导读 frontend/CODEMAP.md https:后端前端图像处理人工智能AI 应用如何替换游戏里的 DLSS 版本免费开源工具 DLSS Swapper 完整指南如何替换游戏里的 DLSS 版本免费开源工具 DLSS Swapper 完整指南 你有没有过这种时刻游戏买了大半年里面用的还是发售那天的旧版 DLSS显桌面应用wandb SDK 源码地图从 Python 侧到 Go 核心的导航指南wandb SDK 源码地图从 Python 侧到 Go 核心的导航指南 导读 本文基于 wandb 仓库中的 docs/sdk/source map.md机器学习深度学习数据可视化可观测性创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

从Wiki到LaTeX教科书:Coursebook开源系统编程书的完整演进之路

从Wiki到LaTeX教科书:Coursebook开源系统编程书的完整演进之路

从Wiki到LaTeX教科书:Coursebook开源系统编程书的完整演进之路 【免费下载链接】coursebook Open Source Introductory Systems Programming Textbook for the University of Illinois 项目地址: https://gitcode.com/GitHub_Trending/co/coursebook Courseb…

2026/10/1 2:25:56 阅读更多 →
ng-table 数据分组实战:从一键分组到自定义分组函数与汇总行的完整指南

ng-table 数据分组实战:从一键分组到自定义分组函数与汇总行的完整指南

ng-table 数据分组实战:从一键分组到自定义分组函数与汇总行的完整指南 【免费下载链接】ng-table Simple table with sorting and filtering on AngularJS 项目地址: https://gitcode.com/gh_mirrors/ng/ng-table ng-table 是 AngularJS 生态中最经典的数据…

2026/10/1 2:25:56 阅读更多 →
ZCode 前端渲染性能优化:用 CSS content-visibility 实现长列表秒级首屏

ZCode 前端渲染性能优化:用 CSS content-visibility 实现长列表秒级首屏

人工智能大模型代码智能体AI Agent桌面应用后端前端CLI 【免费下载链接】ZCode ZCode 是 AI 编程工作台,提供桌面应用、浏览器界面和终端 Agent。本仓库包含客户端、后端服务、共享 UI,以及 Agent CLI 与运行时源码。 项目地址: https://gitc…

2026/10/1 2:25:56 阅读更多 →

最新新闻

电梯监控电动车检测实战:数据、调参与部署避坑指南

电梯监控电动车检测实战:数据、调参与部署避坑指南

简介:面向电梯监控视角下的电动车与自行车识别场景,这份工程资源提供了基于YOLO预训练模型微调的完整解决方案,包含检测与跟踪两种技术路线。检测方式会对每一帧中检测到的目标实例返回标注图像;跟踪方式则在检测基础上进行去重&a…

2026/10/1 3:04:20 阅读更多 →
.NET Core接入微信支付V3服务商模式:从下单到分账退款全攻略

.NET Core接入微信支付V3服务商模式:从下单到分账退款全攻略

简介:这是一份面向.NET Core开发者的微信支付V3服务商模式集成源码,覆盖普通支付、服务商模式支付、回调写回、退款以及分账给个人和子商户等核心链路,适用于电商、SaaS平台及需要二级商户资金分配的项目团队。资源包共696个文件,…

2026/10/1 3:04:20 阅读更多 →
微网多电源容量配置:两阶段鲁棒优化与CCG求解实践

微网多电源容量配置:两阶段鲁棒优化与CCG求解实践

简介:面向微电网与电力系统优化研究者的MATLAB源代码包,聚焦基于两阶段鲁棒优化算法的微网多电源容量配置问题,适合具备一定优化理论基础的学者、工程师用于算法复现与改进。压缩包共426个文件,约91.42MB,主要包含&…

2026/10/1 3:04:20 阅读更多 →
基于Docker和Redis的Scrapy分布式爬虫架构实践

基于Docker和Redis的Scrapy分布式爬虫架构实践

简介:这是一份基于Docker的分布式爬虫服务完整资料包,面向Python与Go技术栈的爬虫开发者,以及计算机相关专业在校学生、教师和企业工程师。资源直接针对多节点爬虫部署、容器化调度与高效抓取场景,既适合毕业设计、课程设计、项目…

2026/10/1 3:04:19 阅读更多 →
微信支付V3工具类封装实践:签名、验签与回调避坑指南

微信支付V3工具类封装实践:签名、验签与回调避坑指南

简介:面向Java开发者的微信支付V3版工具类,针对企业项目中的支付、退款、交易状态查询以及企业打款到个人零钱等高频交易需求,提供了一站式方法封装。压缩包共七个文件,其中五个源码文件承载具体业务逻辑,另有工程描述…

2026/10/1 3:04:19 阅读更多 →
16.RK3588 AI 边缘计算盒子怎么设计?从硬件到交付的要点拆解

16.RK3588 AI 边缘计算盒子怎么设计?从硬件到交付的要点拆解

RK3588 AI 边缘计算盒子怎么设计?从硬件到交付的要点拆解摘要:AI 盒子看起来是"核心板加个壳",真正量产时算力分配、散热、多路视频接入和远程运维每一环都可能翻车。本文按硬件构成、设计要点、交付形态三条线拆解,并附…

2026/10/1 3:03:19 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →